Home | History | Annotate | Download | only in io
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 
     18 package org.apache.harmony.tests.java.io;
     19 
     20 import junit.framework.TestCase;
     21 import java.io.Externalizable;
     22 import java.io.IOException;
     23 import java.io.ObjectInput;
     24 import java.io.ObjectOutput;
     25 import java.io.ObjectStreamClass;
     26 import java.io.ObjectStreamField;
     27 import java.io.Serializable;
     28 import java.lang.reflect.Proxy;
     29 
     30 public class ObjectStreamClassTest extends TestCase {
     31 
     32     static class DummyClass implements Serializable {
     33         private static final long serialVersionUID = 999999999999999L;
     34 
     35         long bam = 999L;
     36 
     37         int ham = 9999;
     38 
     39         public static long getUID() {
     40             return serialVersionUID;
     41         }
     42     }
     43 
     44     /**
     45      * java.io.ObjectStreamClass#forClass()
     46      */
     47     public void test_forClass() {
     48         // Need to test during serialization to be sure an instance is
     49         // returned
     50         ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class);
     51         assertEquals("forClass returned an object: " + osc.forClass(),
     52                 DummyClass.class, osc.forClass());
     53     }
     54 
     55     /**
     56      * java.io.ObjectStreamClass#getField(java.lang.String)
     57      */
     58     public void test_getFieldLjava_lang_String() {
     59         ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class);
     60         assertEquals("getField did not return correct field", 'J', osc
     61                 .getField("bam").getTypeCode());
     62         assertNull("getField did not null for non-existent field", osc
     63                 .getField("wham"));
     64     }
     65 
     66     /**
     67      * java.io.ObjectStreamClass#getFields()
     68      */
     69     public void test_getFields() {
     70         ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class);
     71         ObjectStreamField[] osfArray = osc.getFields();
     72         assertTrue(
     73                 "Array of fields should be of length 2 but is instead of length: "
     74                         + osfArray.length, osfArray.length == 2);
     75     }
     76 
     77     /**
     78      * java.io.ObjectStreamClass#getName()
     79      */
     80     public void test_getName() {
     81         ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class);
     82         assertEquals(
     83                 "getName returned incorrect name: " + osc.getName(),
     84                 "org.apache.harmony.tests.java.io.ObjectStreamClassTest$DummyClass",
     85                 osc.getName());
     86     }
     87 
     88     /**
     89      * java.io.ObjectStreamClass#getSerialVersionUID()
     90      */
     91     public void test_getSerialVersionUID() {
     92         ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class);
     93         assertTrue("getSerialversionUID returned incorrect uid: "
     94                 + osc.getSerialVersionUID() + " instead of "
     95                 + DummyClass.getUID(), osc.getSerialVersionUID() == DummyClass
     96                 .getUID());
     97     }
     98 
     99     static class SyntheticTest implements Serializable {
    100         private int i;
    101 
    102         private class X implements Serializable {
    103             public int get() {
    104                 return i;
    105             }
    106         }
    107 
    108         public X foo() {
    109             return new X();
    110         }
    111     }
    112 
    113     /**
    114      * java.io.ObjectStreamClass#lookup(java.lang.Class)
    115      */
    116     public void test_lookupLjava_lang_Class() {
    117         ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class);
    118         assertEquals(
    119                 "lookup returned wrong class: " + osc.getName(),
    120                 "org.apache.harmony.tests.java.io.ObjectStreamClassTest$DummyClass",
    121                 osc.getName());
    122     }
    123 
    124     /**
    125      * java.io.ObjectStreamClass#toString()
    126      */
    127     public void test_toString() {
    128         ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class);
    129         String oscString = osc.toString();
    130 
    131         // The previous test was more specific than the spec so it was replaced
    132         // with the test below
    133         assertTrue("toString returned incorrect string: " + osc.toString(),
    134                 oscString.indexOf("serialVersionUID") >= 0
    135                         && oscString.indexOf("999999999999999L") >= 0);
    136     }
    137 
    138     public void testSerialization() {
    139         ObjectStreamClass osc = ObjectStreamClass
    140                 .lookup(ObjectStreamClass.class);
    141         assertEquals(0, osc.getFields().length);
    142     }
    143 
    144     public void test_specialTypes() {
    145         Class<?> proxyClass = Proxy.getProxyClass(this.getClass()
    146                 .getClassLoader(), new Class[] { Runnable.class });
    147 
    148         ObjectStreamClass proxyStreamClass = ObjectStreamClass
    149                 .lookup(proxyClass);
    150 
    151         assertEquals("Proxy classes should have zero serialVersionUID", 0,
    152                 proxyStreamClass.getSerialVersionUID());
    153         ObjectStreamField[] proxyFields = proxyStreamClass.getFields();
    154         assertEquals("Proxy classes should have no serialized fields", 0,
    155                 proxyFields.length);
    156 
    157         ObjectStreamClass enumStreamClass = ObjectStreamClass
    158                 .lookup(Thread.State.class);
    159 
    160         assertEquals("Enum classes should have zero serialVersionUID", 0,
    161                 enumStreamClass.getSerialVersionUID());
    162         ObjectStreamField[] enumFields = enumStreamClass.getFields();
    163         assertEquals("Enum classes should have no serialized fields", 0,
    164                 enumFields.length);
    165     }
    166 
    167     /**
    168      * @since 1.6
    169      */
    170     static class NonSerialzableClass {
    171         private static final long serialVersionUID = 1l;
    172 
    173         public static long getUID() {
    174             return serialVersionUID;
    175         }
    176     }
    177 
    178     /**
    179      * @since 1.6
    180      */
    181     static class ExternalizableClass implements Externalizable {
    182 
    183         private static final long serialVersionUID = -4285635779249689129L;
    184 
    185         public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException {
    186             throw new ClassNotFoundException();
    187         }
    188 
    189         public void writeExternal(ObjectOutput output) throws IOException {
    190             throw new IOException();
    191         }
    192 
    193     }
    194 
    195     /**
    196      * java.io.ObjectStreamClass#lookupAny(java.lang.Class)
    197      * @since 1.6
    198      */
    199     public void test_lookupAnyLjava_lang_Class() {
    200         // Test for method java.io.ObjectStreamClass
    201         // java.io.ObjectStreamClass.lookupAny(java.lang.Class)
    202         ObjectStreamClass osc = ObjectStreamClass.lookupAny(DummyClass.class);
    203         assertEquals("lookup returned wrong class: " + osc.getName(),
    204                 "org.apache.harmony.tests.java.io.ObjectStreamClassTest$DummyClass", osc
    205                 .getName());
    206 
    207         osc = ObjectStreamClass.lookupAny(NonSerialzableClass.class);
    208         assertEquals("lookup returned wrong class: " + osc.getName(),
    209                 "org.apache.harmony.tests.java.io.ObjectStreamClassTest$NonSerialzableClass",
    210                 osc.getName());
    211 
    212         osc = ObjectStreamClass.lookupAny(ExternalizableClass.class);
    213         assertEquals("lookup returned wrong class: " + osc.getName(),
    214                 "org.apache.harmony.tests.java.io.ObjectStreamClassTest$ExternalizableClass",
    215                 osc.getName());
    216 
    217         osc = ObjectStreamClass.lookup(NonSerialzableClass.class);
    218         assertNull(osc);
    219 
    220     }
    221 
    222 
    223 }
    224