| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package tests.api.java.io; |
| |
| import dalvik.annotation.AndroidOnly; |
| import dalvik.annotation.BrokenTest; |
| import dalvik.annotation.TestLevel; |
| import dalvik.annotation.TestTargetClass; |
| import dalvik.annotation.TestTargetNew; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.DataInputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.InvalidObjectException; |
| import java.io.NotActiveException; |
| import java.io.ObjectInputStream; |
| import java.io.ObjectOutputStream; |
| import java.io.ObjectStreamClass; |
| import java.io.ObjectStreamException; |
| import java.io.Serializable; |
| import java.io.StreamCorruptedException; |
| import java.io.WriteAbortedException; |
| import java.util.Arrays; |
| import java.util.Hashtable; |
| import java.util.Vector; |
| |
| /** |
| * Automated Test Suite for class java.io.ObjectOutputStream |
| * |
| */ |
| @TestTargetClass(Serializable.class) |
| public class SerializationStressTest0 extends SerializationStressTest { |
| |
| private static class ObjectInputStreamSubclass extends ObjectInputStream { |
| private Vector resolvedClasses = new Vector(); |
| |
| public ObjectInputStreamSubclass(InputStream in) throws IOException, |
| StreamCorruptedException { |
| super(in); |
| } |
| |
| public Class resolveClass(ObjectStreamClass osClass) |
| throws IOException, ClassNotFoundException { |
| Class result = super.resolveClass(osClass); |
| resolvedClasses.addElement(result); |
| return result; |
| } |
| |
| public Class[] resolvedClasses() { |
| return (Class[]) resolvedClasses.toArray(new Class[resolvedClasses |
| .size()]); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_1_Constructor() { |
| // Test for method java.io.ObjectOutputStream(java.io.OutputStream) |
| |
| try { |
| oos.close(); |
| oos = new ObjectOutputStream(new ByteArrayOutputStream()); |
| oos.close(); |
| } catch (Exception e) { |
| fail("Failed to create ObjectOutputStream : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_2_close() { |
| // Test for method void java.io.ObjectOutputStream.close() |
| try { |
| oos.close(); |
| oos = new ObjectOutputStream(bao = new ByteArrayOutputStream()); |
| oos.close(); |
| oos.writeChar('T'); |
| oos.writeObject(FOO); |
| // Writing to a closed stream does not cause problems. This is |
| // the expected behavior |
| } catch (IOException e) { |
| fail("Operation on closed stream threw IOException : " |
| + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_3_defaultWriteObject() { |
| // Test for method void java.io.ObjectOutputStream.defaultWriteObject() |
| |
| try { |
| oos.defaultWriteObject(); |
| } catch (NotActiveException e) { |
| // Correct |
| return; |
| } catch (IOException e) { |
| } |
| fail( |
| "Failed to throw NotActiveException when invoked outside readObject"); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_4_flush() { |
| // Test for method void java.io.ObjectOutputStream.flush() |
| try { |
| oos.close(); |
| oos = new ObjectOutputStream(bao = new ByteArrayOutputStream()); |
| int size = bao.size(); |
| oos.writeByte(127); |
| assertTrue("Data flushed already", bao.size() == size); |
| oos.flush(); |
| assertTrue("Failed to flush data", bao.size() > size); |
| // we don't know how many bytes are actually written for 1 byte, |
| // so we test > <before> |
| oos.close(); |
| oos = null; |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_5_reset() { |
| // Test for method void java.io.ObjectOutputStream.reset() |
| try { |
| String o = "HelloWorld"; |
| oos.writeObject(o); |
| oos.writeObject(o); |
| oos.reset(); |
| oos.writeObject(o); |
| ois = new ObjectInputStream(loadStream()); |
| ois.close(); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_6_write() { |
| // Test for method void java.io.ObjectOutputStream.write(byte [], int, |
| // int) |
| try { |
| byte[] buf = new byte[255]; |
| byte[] output = new byte[255]; |
| for (int i = 0; i < output.length; i++) |
| output[i] = (byte) i; |
| oos.write(output, 0, output.length); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| ois.readFully(buf); |
| ois.close(); |
| for (int i = 0; i < output.length; i++) |
| if (buf[i] != output[i]) |
| fail("Read incorrect byte: " + i); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_6a_write() { |
| // Test for method void java.io.ObjectOutputStream.write(byte [], int, |
| // int) |
| try { |
| byte[] buf = new byte[256]; |
| byte[] output = new byte[256]; |
| for (int i = 0; i < output.length; i++) |
| output[i] = (byte) (i & 0xff); |
| oos.write(output, 0, output.length); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| ois.readFully(buf); |
| ois.close(); |
| for (int i = 0; i < output.length; i++) |
| if (buf[i] != output[i]) |
| fail("Read incorrect byte: " + i); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_7_write() { |
| // Test for method void java.io.ObjectOutputStream.write(int) |
| try { |
| byte[] buf = new byte[10]; |
| oos.write('T'); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| assertEquals("Read incorrect byte", 'T', ois.read()); |
| ois.close(); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_8_write() { |
| // Test for method void java.io.ObjectOutputStream.write(byte []) |
| try { |
| byte[] buf = new byte[10]; |
| oos.write("HelloWorld".getBytes()); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| ois.read(buf, 0, 10); |
| ois.close(); |
| assertEquals("Read incorrect bytes", "HelloWorld", new String(buf, 0, 10) |
| ); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_9_writeBoolean() { |
| // Test for method void java.io.ObjectOutputStream.writeBoolean(boolean) |
| try { |
| oos.writeBoolean(true); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| assertTrue("Wrote incorrect byte value", ois.readBoolean()); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_10_writeByte() { |
| // Test for method void java.io.ObjectOutputStream.writeByte(int) |
| try { |
| oos.writeByte(127); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| assertEquals("Wrote incorrect byte value", 127, ois.readByte()); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_11_writeBytes() { |
| // Test for method void |
| // java.io.ObjectOutputStream.writeBytes(java.lang.String) |
| try { |
| byte[] buf = new byte[10]; |
| oos.writeBytes("HelloWorld"); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| ois.readFully(buf); |
| ois.close(); |
| assertEquals("Wrote incorrect bytes value", "HelloWorld", new String(buf, 0, 10) |
| ); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_12_writeChar() { |
| // Test for method void java.io.ObjectOutputStream.writeChar(int) |
| try { |
| oos.writeChar('T'); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| assertEquals("Wrote incorrect char value", 'T', ois.readChar()); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_13_writeChars() { |
| // Test for method void |
| // java.io.ObjectOutputStream.writeChars(java.lang.String) |
| try { |
| int avail = 0; |
| char[] buf = new char[10]; |
| oos.writeChars("HelloWorld"); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| // Number of prim data bytes in stream / 2 to give char index |
| avail = ois.available() / 2; |
| for (int i = 0; i < avail; ++i) |
| buf[i] = ois.readChar(); |
| ois.close(); |
| assertEquals("Wrote incorrect chars", "HelloWorld", new String(buf, 0, 10) |
| ); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_14_writeDouble() { |
| // Test for method void java.io.ObjectOutputStream.writeDouble(double) |
| try { |
| oos.writeDouble(Double.MAX_VALUE); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| assertTrue("Wrote incorrect double value", |
| ois.readDouble() == Double.MAX_VALUE); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_15_writeFloat() { |
| // Test for method void java.io.ObjectOutputStream.writeFloat(float) |
| try { |
| oos.writeFloat(Float.MAX_VALUE); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| assertTrue("Wrote incorrect double value", |
| ois.readFloat() == Float.MAX_VALUE); |
| ois.close(); |
| ois = null; |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_16_writeInt() { |
| // Test for method void java.io.ObjectOutputStream.writeInt(int) |
| try { |
| oos.writeInt(Integer.MAX_VALUE); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| assertTrue("Wrote incorrect double value", |
| ois.readInt() == Integer.MAX_VALUE); |
| ois.close(); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_17_writeLong() { |
| // Test for method void java.io.ObjectOutputStream.writeLong(long) |
| try { |
| oos.writeLong(Long.MAX_VALUE); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| assertTrue("Wrote incorrect double value", |
| ois.readLong() == Long.MAX_VALUE); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_19_writeShort() { |
| // Test for method void java.io.ObjectOutputStream.writeShort(int) |
| try { |
| oos.writeShort(127); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| assertEquals("Wrote incorrect short value", 127, ois.readShort()); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_20_writeUTF() { |
| // Test for method void |
| // java.io.ObjectOutputStream.writeUTF(java.lang.String) |
| try { |
| oos.writeUTF("HelloWorld"); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| assertEquals("Wrote incorrect UTF value", |
| "HelloWorld", ois.readUTF()); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_25_available() { |
| try { |
| oos.writeObject(FOO); |
| oos.writeObject(FOO); |
| oos.flush(); |
| int available1 = 0; |
| int available2 = 0; |
| Object obj1 = null; |
| Object obj2 = null; |
| ObjectInputStream ois = new ObjectInputStream(loadStream()); |
| available1 = ois.available(); |
| obj1 = ois.readObject(); |
| available2 = ois.available(); |
| obj2 = ois.readObject(); |
| |
| assertEquals("available returned incorrect value", 0, available1); |
| assertEquals("available returned incorrect value", 0, available2); |
| |
| assertTrue("available caused incorrect reading", FOO.equals(obj1)); |
| assertTrue("available returned incorrect value", FOO.equals(obj2)); |
| |
| } catch (IOException e) { |
| fail("IOException serializing object : " + e.getMessage()); |
| } catch (ClassNotFoundException e) { |
| fail("Unable to read Object type : " + e.toString()); |
| } catch (Error err) { |
| System.out.println("Error " + err); |
| throw err; |
| } |
| |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_resolveClass() { |
| try { |
| oos.writeObject(new Object[] { Integer.class, new Integer(1) }); |
| oos.close(); |
| |
| ois = new ObjectInputStreamSubclass(loadStream()); |
| ois.readObject(); |
| ois.close(); |
| } catch (IOException e1) { |
| fail("IOException : " + e1.getMessage()); |
| } catch (ClassNotFoundException e2) { |
| fail("ClassNotFoundException : " + e2.getMessage()); |
| } |
| |
| Class[] resolvedClasses = ((ObjectInputStreamSubclass) ois) |
| .resolvedClasses(); |
| assertEquals("missing resolved", 3, resolvedClasses.length); |
| assertTrue("resolved class 1", resolvedClasses[0] == Object[].class); |
| assertTrue("resolved class 2", resolvedClasses[1] == Integer.class); |
| assertTrue("resolved class 3", resolvedClasses[2] == Number.class); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_reset() { |
| try { |
| oos.reset(); |
| oos.writeObject("R"); |
| oos.reset(); |
| oos.writeByte(24); |
| oos.close(); |
| |
| DataInputStream dis = new DataInputStream(loadStream()); |
| byte[] input = new byte[dis.available()]; |
| dis.readFully(input); |
| byte[] result = new byte[] { (byte) 0xac, (byte) 0xed, (byte) 0, |
| (byte) 5, (byte) 0x79, (byte) 0x74, (byte) 0, (byte) 1, |
| (byte) 'R', (byte) 0x79, (byte) 0x77, (byte) 1, (byte) 24 }; |
| assertTrue("incorrect output", Arrays.equals(input, result)); |
| |
| ois = new ObjectInputStreamSubclass(loadStream()); |
| assertEquals("Wrong result from readObject()", "R", ois.readObject() |
| ); |
| assertEquals("Wrong result from readByte()", 24, ois.readByte()); |
| ois.close(); |
| } catch (IOException e1) { |
| fail("IOException : " + e1.getMessage()); |
| } catch (ClassNotFoundException e2) { |
| fail("ClassNotFoundException : " + e2.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_serialVersionUID(Class clazz, long svUID) { |
| final String idWrong = "serialVersionUID is wrong for: "; |
| long reflectedSvUID = 0L; |
| try { |
| reflectedSvUID = clazz.getField("serialVersionUID").getLong(null); |
| } catch (Exception e) { |
| fail("Unable to determine serialVersionUID of " + clazz); |
| } |
| assertTrue(idWrong + clazz + ": " + reflectedSvUID + " does not equal " |
| + svUID, reflectedSvUID == svUID); |
| } |
| |
| private static class ResolveObjectTest implements Serializable { |
| Object field1, field2; |
| } |
| |
| private static class ResolveObjectInputStream extends ObjectInputStream { |
| ResolveObjectInputStream(InputStream in) |
| throws StreamCorruptedException, IOException { |
| super(in); |
| } |
| |
| public void enableResolve() { |
| enableResolveObject(true); |
| } |
| |
| public Object resolveObject(Object obj) { |
| if (obj instanceof Vector) // test_1_resolveObject() |
| return new Hashtable(); |
| else if ("abc".equals(obj)) // test_2_resolveObject() |
| return "ABC"; |
| else if (obj instanceof String) // test_3_resolveObject() |
| return String.valueOf(((String) obj).length()); |
| else if (obj instanceof int[]) // test_4_resolveObject() |
| return new Object[1]; |
| else if (obj instanceof Object[] && ((Object[]) obj).length == 2) // test_5_resolveObject() |
| return new char[1]; |
| return obj; |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_1_resolveObject() { |
| try { |
| ResolveObjectTest obj = new ResolveObjectTest(); |
| obj.field1 = new Vector(); |
| obj.field2 = obj.field1; |
| oos.writeObject(obj); |
| oos.close(); |
| ois = new ResolveObjectInputStream(loadStream()); |
| ((ResolveObjectInputStream) ois).enableResolve(); |
| ResolveObjectTest result = null; |
| try { |
| result = (ResolveObjectTest) ois.readObject(); |
| } catch (ClassNotFoundException e) { |
| fail(e.toString()); |
| } |
| assertTrue("Object not resolved", |
| result.field1 instanceof Hashtable); |
| assertTrue("Second reference not resolved", |
| result.field1 == result.field2); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_2_resolveObject() { |
| try { |
| ResolveObjectTest obj = new ResolveObjectTest(); |
| obj.field1 = "abc"; |
| obj.field2 = obj.field1; |
| oos.writeObject(obj); |
| oos.close(); |
| ois = new ResolveObjectInputStream(loadStream()); |
| ((ResolveObjectInputStream) ois).enableResolve(); |
| ResolveObjectTest result = null; |
| try { |
| result = (ResolveObjectTest) ois.readObject(); |
| } catch (ClassNotFoundException e) { |
| fail(e.toString()); |
| } |
| assertEquals("String not resolved", "ABC", result.field1); |
| assertTrue("Second reference not resolved", |
| result.field1 == result.field2); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_3_resolveObject() { |
| try { |
| ResolveObjectTest obj = new ResolveObjectTest(); |
| char[] lchars = new char[70000]; |
| obj.field1 = new String(lchars); |
| obj.field2 = obj.field1; |
| oos.writeObject(obj); |
| oos.close(); |
| ois = new ResolveObjectInputStream(loadStream()); |
| ((ResolveObjectInputStream) ois).enableResolve(); |
| ResolveObjectTest result = null; |
| try { |
| result = (ResolveObjectTest) ois.readObject(); |
| } catch (ClassNotFoundException e) { |
| fail(e.toString()); |
| } |
| assertTrue("Long String not resolved", "70000" |
| .equals(result.field1)); |
| assertTrue("Second reference not resolved", |
| result.field1 == result.field2); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_4_resolveObject() { |
| try { |
| ResolveObjectTest obj = new ResolveObjectTest(); |
| obj.field1 = new int[5]; |
| obj.field2 = obj.field1; |
| oos.writeObject(obj); |
| oos.close(); |
| ois = new ResolveObjectInputStream(loadStream()); |
| ((ResolveObjectInputStream) ois).enableResolve(); |
| ResolveObjectTest result = null; |
| try { |
| result = (ResolveObjectTest) ois.readObject(); |
| } catch (ClassNotFoundException e) { |
| fail(e.toString()); |
| } |
| Class cl = new Object[0].getClass(); |
| assertTrue("int[] not resolved", result.field1.getClass() == cl); |
| assertTrue("Second reference not resolved", |
| result.field1 == result.field2); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_5_resolveObject() { |
| try { |
| ResolveObjectTest obj = new ResolveObjectTest(); |
| obj.field1 = new Object[2]; |
| obj.field2 = obj.field1; |
| oos.writeObject(obj); |
| oos.close(); |
| ois = new ResolveObjectInputStream(loadStream()); |
| ((ResolveObjectInputStream) ois).enableResolve(); |
| ResolveObjectTest result = null; |
| try { |
| result = (ResolveObjectTest) ois.readObject(); |
| } catch (ClassNotFoundException e) { |
| fail(e.toString()); |
| } |
| Class cl = new char[0].getClass(); |
| assertTrue("int[] not resolved", result.field1.getClass() == cl); |
| assertTrue("Second reference not resolved", |
| result.field1 == result.field2); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| static class WriteReplaceTestA implements Serializable { |
| public Object writeReplace() throws ObjectStreamException { |
| return new ReadResolveTestB(); |
| } |
| } |
| |
| static class WriteReplaceTestB extends WriteReplaceTestA { |
| } |
| |
| static class WriteReplaceTestC extends WriteReplaceTestA { |
| public Object writeReplace() throws ObjectStreamException { |
| return new ReadResolveTestC(); |
| } |
| } |
| |
| static class WriteReplaceTestD implements Serializable { |
| private Object writeReplace() throws ObjectStreamException { |
| return new ReadResolveTestD(); |
| } |
| } |
| |
| static class WriteReplaceTestE extends WriteReplaceTestD { |
| } |
| |
| static class WriteReplaceTestF implements Serializable { |
| int type, readType; |
| |
| public WriteReplaceTestF(int type, int readType) { |
| this.type = type; |
| this.readType = readType; |
| } |
| |
| public Object writeReplace() throws ObjectStreamException { |
| switch (type) { |
| case 0: |
| throw new InvalidObjectException("invalid"); |
| case 1: |
| throw new RuntimeException("runtime"); |
| case 2: |
| throw new Error("error"); |
| default: |
| return new ReadResolveTestE(readType); |
| } |
| } |
| } |
| |
| static class ReadResolveTestA implements Serializable { |
| public Object readResolve() throws ObjectStreamException { |
| return new ReadResolveTestA(); |
| } |
| } |
| |
| static class ReadResolveTestB extends ReadResolveTestA { |
| } |
| |
| static class ReadResolveTestC implements Serializable { |
| private Object readResolve() throws ObjectStreamException { |
| return new ReadResolveTestB(); |
| } |
| } |
| |
| static class ReadResolveTestD extends ReadResolveTestC { |
| } |
| |
| static class ReadResolveTestE implements Serializable { |
| int type; |
| |
| public ReadResolveTestE(int type) { |
| this.type = type; |
| } |
| |
| public Object readResolve() throws ObjectStreamException { |
| switch (type) { |
| case 0: |
| throw new InvalidObjectException("invalid"); |
| case 1: |
| throw new RuntimeException("runtime"); |
| case 2: |
| throw new Error("error"); |
| case 3: |
| return this; |
| default: |
| return new ReadResolveTestF(); |
| } |
| } |
| } |
| |
| static class ReadResolveTestF implements Serializable { |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_1_writeReplace() { |
| try { |
| Vector v = new Vector(); |
| v.addElement(new WriteReplaceTestA()); |
| v.addElement(new WriteReplaceTestB()); |
| v.addElement(new WriteReplaceTestB()); |
| v.addElement(new WriteReplaceTestC()); |
| v.addElement(new WriteReplaceTestD()); |
| v.addElement(new WriteReplaceTestE()); |
| oos.writeObject(v); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| Vector result = (Vector) ois.readObject(); |
| assertTrue("invalid 0 : " + result.elementAt(0), result |
| .elementAt(0).getClass() == ReadResolveTestA.class); |
| assertTrue("invalid 1 : " + result.elementAt(1), result |
| .elementAt(1).getClass() == ReadResolveTestA.class); |
| assertTrue("invalid 2 : " + result.elementAt(2), result |
| .elementAt(2).getClass() == ReadResolveTestA.class); |
| assertTrue("invalid 3 : " + result.elementAt(3), result |
| .elementAt(3).getClass() == ReadResolveTestB.class); |
| assertTrue("invalid 4 : " + result.elementAt(4), result |
| .elementAt(4).getClass() == ReadResolveTestD.class); |
| assertTrue("invalid 5 : " + result.elementAt(5), result |
| .elementAt(5).getClass() == WriteReplaceTestE.class); |
| } catch (IOException e) { |
| fail("IOException serializing data : " + e.getMessage()); |
| } catch (ClassNotFoundException e) { |
| fail("ClassNotFoundException serializing data : " + e.getMessage()); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_2_writeReplace_01() throws IOException { |
| try { |
| oos.writeObject(new WriteReplaceTestF(0, -1)); |
| fail("Should throw ObjectStreamException"); |
| } catch (ObjectStreamException e) { |
| // expected |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_2_writeReplace_02() throws IOException { |
| try { |
| oos.writeObject(new WriteReplaceTestF(1, -1)); |
| fail("Should throw RuntimeException"); |
| } catch (RuntimeException e) { |
| // expected |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_2_writeReplace_03() throws IOException { |
| try { |
| oos.writeObject(new WriteReplaceTestF(2, -1)); |
| fail("Should throw Error"); |
| } catch (Error e) { |
| // expected |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "Verifies serialization.", |
| method = "!Serialization", |
| args = {} |
| ) |
| public void test_2_writeReplace_04() throws IOException, |
| ClassNotFoundException { |
| oos.writeObject(new WriteReplaceTestF(3, 0)); |
| oos.writeObject(new WriteReplaceTestF(3, 1)); |
| oos.writeObject(new WriteReplaceTestF(3, 2)); |
| WriteReplaceTestF test = new WriteReplaceTestF(3, 3); |
| oos.writeObject(test); |
| oos.writeObject(test); |
| WriteReplaceTestF test2 = new WriteReplaceTestF(3, 4); |
| oos.writeObject(test2); |
| oos.writeObject(test2); |
| oos.close(); |
| ois = new ObjectInputStream(loadStream()); |
| try { |
| ois.readObject(); |
| fail("Expected InvalidObjectException"); |
| } catch (InvalidObjectException e) { |
| // expected |
| } |
| |
| try { |
| ois.readObject(); |
| fail("Expected RuntimeException"); |
| } catch (RuntimeException e) { |
| // expected |
| } |
| |
| try { |
| ois.readObject(); |
| fail("Expected Error"); |
| } catch (Error e) { |
| // expected |
| } |
| |
| Object readE1 = ois.readObject(); |
| Object readE2 = ois.readObject(); |
| assertTrue("Replaced objects should be identical", readE1 == readE2); |
| Object readF1 = ois.readObject(); |
| Object readF2 = ois.readObject(); |
| assertTrue("Replaced resolved objects should be identical: " |
| + readF1 + " " + readF2, readF1 == readF2); |
| } |
| } |