/* * 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 org.apache.harmony.luni.tests.java.io; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InvalidClassException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamClass; import java.io.ObjectStreamException; import java.io.OptionalDataException; import java.io.Serializable; import java.io.StreamCorruptedException; import java.util.ArrayList; import junit.framework.TestCase; import org.apache.harmony.testframework.serialization.SerializationTest; import tests.support.Support_ASimpleInputStream; //import dalvik.annotation.TestLevel; //import dalvik.annotation.TestTargetClass; //import dalvik.annotation.TestTargetNew; //@TestTargetClass(ObjectInputStream.class) public class ObjectInputStreamTest extends TestCase { ObjectInputStream ois; ObjectOutputStream oos; ByteArrayOutputStream bao; private final String testString = "Lorem ipsum..."; protected void setUp() throws Exception { super.setUp(); oos = new ObjectOutputStream(bao = new ByteArrayOutputStream()); } /* @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Checks ObjectStreamException and OptionalDataException.", method = "readUnshared", args = {} ) public void test_readUnshared_1() throws IOException, ClassNotFoundException { oos.writeObject(testString); oos.writeObject(testString); oos.writeInt(42); oos.close(); ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray())); try { ois.readUnshared(); ois.readObject(); fail("Test 1: ObjectStreamException expected."); } catch (ObjectStreamException e) { // Expected. } try { ois.readUnshared(); fail("Test 2: OptionalDataException expected."); } catch (OptionalDataException e) { // Expected. } ois.close(); } /** * @tests java.io.ObjectInputStream#readUnshared() @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Checks StreamCorruptedException.", method = "readUnshared", args = {} ) */ public void test_readUnshared_2() throws IOException, ClassNotFoundException { oos.close(); bao.write(testString.getBytes()); ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray())); try { ois.readUnshared(); fail("Test 1: StreamCorruptedException expected."); } catch (StreamCorruptedException e) { // Expected. } ois.close(); } /** * @tests java.io.ObjectInputStream#readUnshared() @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Checks IOException.", method = "readUnshared", args = {} ) */ public void test_readUnshared_3() throws IOException, ClassNotFoundException { bao.write(testString.getBytes()); oos.close(); Support_ASimpleInputStream sis = new Support_ASimpleInputStream(bao.toByteArray()); ois = new ObjectInputStream(sis); sis.throwExceptionOnNextUse = true; try { ois.readUnshared(); fail("Test 1: IOException expected."); } catch (IOException e) { // Expected. } sis.throwExceptionOnNextUse = false; ois.close(); } /** * Micro-scenario of de/serialization of an object with non-serializable superclass. * The super-constructor only should be invoked on the deserialized instance. @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, method = "readObject", args = {} ) */ public void test_readObject_Hierarchy() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(new B()); oos.close(); ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray())); B b = (B) ois.readObject(); ois.close(); assertTrue("should construct super", A.list.contains(b)); assertFalse("should not construct self", B.list.contains(b)); assertEquals("super field A.s", A.DEFAULT, ((A)b).s); assertNull("transient field B.s", b.s); } /** * @tests {@link java.io.ObjectInputStream#readNewLongString()} @TestTargetNew( level = TestLevel.COMPLETE, notes = "Verifies serialization.", method = "!SerializationSelf", args = {} ) */ public void test_readNewLongString() throws Exception { LongString longString = new LongString(); SerializationTest.verifySelf(longString); } private static class LongString implements Serializable{ private static final long serialVersionUID = 1L; String lString; public LongString() { StringBuilder builder = new StringBuilder(); // construct a string whose length > 64K for (int i = 0; i < 65636; i++) { builder.append('1'); } lString = builder.toString(); } @Override public boolean equals(Object o) { if (o == this) { return true; } if (o instanceof LongString) { LongString l = (LongString) o; return l.lString.equals(l.lString); } return true; } @Override public int hashCode() { return lString.hashCode(); } } static class A { static final ArrayList<A> list = new ArrayList<A>(); String s; public static final String DEFAULT = "aaa"; public A() { s = DEFAULT; list.add(this); } } static class B extends A implements Serializable { private static final long serialVersionUID = 1L; static final ArrayList<A> list = new ArrayList<A>(); transient String s; public B() { s = "bbb"; list.add(this); } } class OIS extends ObjectInputStream { OIS () throws IOException { super(); } void test() throws ClassNotFoundException,IOException { readClassDescriptor(); } } /* @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, method = "readClassDescriptor", args = {} ) */ public void test_readClassDescriptor() throws ClassNotFoundException, IOException { try { new OIS().test(); fail("Test 1: NullPointerException expected."); } catch (NullPointerException e) { // Expected. } } static class TestObjectInputStream extends ObjectInputStream { public TestObjectInputStream(InputStream in) throws IOException { super(in); } protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { if (desc.getName().endsWith("ObjectInputStreamTest$TestClass1")) { return TestClass2.class; } return super.resolveClass(desc); } } static class TestClass1 implements Serializable { private static final long serialVersionUID = 11111L; int i = 0; } static class TestClass2 implements Serializable { private static final long serialVersionUID = 11111L; int i = 0; } /* @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Checks InvalidClassException.", method = "resolveClass", args = {java.io.ObjectStreamClass.class} ) */ public void test_resolveClass_invalidClassName() throws Exception { // Regression test for HARMONY-1920 TestClass1 to1 = new TestClass1(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); ByteArrayInputStream bais; ObjectInputStream ois; to1.i = 555; oos.writeObject(to1); oos.flush(); byte[] bytes = baos.toByteArray(); bais = new ByteArrayInputStream(bytes); ois = new TestObjectInputStream(bais); try { ois.readObject(); fail("Test 1: InvalidClassException expected."); } catch (InvalidClassException ice) { // Expected. } } }