ObjectStreamClassTest.java revision 747d4cd5e39da3be38ec1d2da9fb7403006ed7c4
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 18package org.apache.harmony.luni.tests.java.io; 19 20import java.io.File; 21import java.io.Externalizable; 22import java.io.IOException; 23import java.io.ObjectInput; 24import java.io.ObjectOutput; 25import java.io.ObjectStreamClass; 26import java.io.ObjectStreamField; 27import java.io.Serializable; 28import java.net.URL; 29import java.net.URLClassLoader; 30import java.lang.reflect.Proxy; 31 32import junit.framework.TestCase; 33 34public class ObjectStreamClassTest extends TestCase { 35 36 static class DummyClass implements Serializable { 37 private static final long serialVersionUID = 999999999999999L; 38 39 long bam = 999L; 40 41 int ham = 9999; 42 43 public static long getUID() { 44 return serialVersionUID; 45 } 46 } 47 48 /** 49 * @tests java.io.ObjectStreamClass#forClass() 50 */ 51 public void test_forClass() { 52 // Need to test during serialization to be sure an instance is 53 // returned 54 ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class); 55 assertEquals("forClass returned an object: " + osc.forClass(), 56 DummyClass.class, osc.forClass()); 57 } 58 59 /** 60 * @tests java.io.ObjectStreamClass#getField(java.lang.String) 61 */ 62 public void test_getFieldLjava_lang_String() { 63 ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class); 64 assertEquals("getField did not return correct field", 'J', osc 65 .getField("bam").getTypeCode()); 66 assertNull("getField did not null for non-existent field", osc 67 .getField("wham")); 68 } 69 70 /** 71 * @tests java.io.ObjectStreamClass#getFields() 72 */ 73 public void test_getFields() { 74 ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class); 75 ObjectStreamField[] osfArray = osc.getFields(); 76 assertTrue( 77 "Array of fields should be of length 2 but is instead of length: " 78 + osfArray.length, osfArray.length == 2); 79 } 80 81 /** 82 * @tests java.io.ObjectStreamClass#getName() 83 */ 84 public void test_getName() { 85 ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class); 86 assertEquals( 87 "getName returned incorrect name: " + osc.getName(), 88 "org.apache.harmony.luni.tests.java.io.ObjectStreamClassTest$DummyClass", 89 osc.getName()); 90 } 91 92 /** 93 * @tests java.io.ObjectStreamClass#getSerialVersionUID() 94 */ 95 public void test_getSerialVersionUID() { 96 ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class); 97 assertTrue("getSerialversionUID returned incorrect uid: " 98 + osc.getSerialVersionUID() + " instead of " 99 + DummyClass.getUID(), osc.getSerialVersionUID() == DummyClass 100 .getUID()); 101 } 102 103 static class SyntheticTest implements Serializable { 104 private int i; 105 106 private class X implements Serializable { 107 public int get() { 108 return i; 109 } 110 } 111 112 public X foo() { 113 return new X(); 114 } 115 } 116 117 public void test_getSerialVersionUID_inner_private_class() { 118 ObjectStreamClass osc1 = ObjectStreamClass.lookup(SyntheticTest.class); 119 assertEquals(-4332969662791850406L, osc1.getSerialVersionUID()); 120 121 ObjectStreamClass osc2 = ObjectStreamClass.lookup(SyntheticTest.X.class); 122 assertEquals(-3926212872029449440L, osc2.getSerialVersionUID()); 123 } 124 125 /** 126 * @tests java.io.ObjectStreamClass#getSerialVersionUID() 127 */ 128 public void test_getSerialVersionUID_classloader() throws Exception { 129 File file = new File( 130 "resources/org/apache/harmony/luni/tests/ObjectStreamClassTest.jar"); 131 ClassLoader loader = new URLClassLoader(new URL[] { file.toURL() }, 132 null); 133 Class cl1 = Class.forName("Test1$TestVarArgs", false, loader); 134 ObjectStreamClass osc1 = ObjectStreamClass.lookup(cl1); 135 assertEquals("Test1$TestVarArgs unexpected UID: " 136 + osc1.getSerialVersionUID(), -6051121963037986215L, osc1 137 .getSerialVersionUID()); 138 139 Class cl2 = Class.forName("Test1$TestBridge", false, loader); 140 ObjectStreamClass osc2 = ObjectStreamClass.lookup(cl2); 141 assertEquals("Test1$TestBridge unexpected UID: " 142 + osc2.getSerialVersionUID(), 568585976855071180L, osc2 143 .getSerialVersionUID()); 144 } 145 146 /** 147 * @tests java.io.ObjectStreamClass#lookup(java.lang.Class) 148 */ 149 public void test_lookupLjava_lang_Class() { 150 ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class); 151 assertEquals( 152 "lookup returned wrong class: " + osc.getName(), 153 "org.apache.harmony.luni.tests.java.io.ObjectStreamClassTest$DummyClass", 154 osc.getName()); 155 } 156 157 /** 158 * @tests java.io.ObjectStreamClass#toString() 159 */ 160 public void test_toString() { 161 ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class); 162 String oscString = osc.toString(); 163 164 // The previous test was more specific than the spec so it was replaced 165 // with the test below 166 assertTrue("toString returned incorrect string: " + osc.toString(), 167 oscString.indexOf("serialVersionUID") >= 0 168 && oscString.indexOf("999999999999999L") >= 0); 169 } 170 171 public void testSerialization() { 172 ObjectStreamClass osc = ObjectStreamClass 173 .lookup(ObjectStreamClass.class); 174 assertEquals(0, osc.getFields().length); 175 } 176 177 public void test_specialTypes() { 178 Class<?> proxyClass = Proxy.getProxyClass(this.getClass() 179 .getClassLoader(), new Class[] { Runnable.class }); 180 181 ObjectStreamClass proxyStreamClass = ObjectStreamClass 182 .lookup(proxyClass); 183 184 assertEquals("Proxy classes should have zero serialVersionUID", 0, 185 proxyStreamClass.getSerialVersionUID()); 186 ObjectStreamField[] proxyFields = proxyStreamClass.getFields(); 187 assertEquals("Proxy classes should have no serialized fields", 0, 188 proxyFields.length); 189 190 ObjectStreamClass enumStreamClass = ObjectStreamClass 191 .lookup(Thread.State.class); 192 193 assertEquals("Enum classes should have zero serialVersionUID", 0, 194 enumStreamClass.getSerialVersionUID()); 195 ObjectStreamField[] enumFields = enumStreamClass.getFields(); 196 assertEquals("Enum classes should have no serialized fields", 0, 197 enumFields.length); 198 } 199 200 /** 201 * @since 1.6 202 */ 203 static class NonSerialzableClass { 204 private static final long serialVersionUID = 1l; 205 public static long getUID() { 206 return serialVersionUID; 207 } 208 } 209 210 /** 211 * @since 1.6 212 */ 213 static class ExternalizableClass implements Externalizable { 214 215 private static final long serialVersionUID = -4285635779249689129L; 216 217 public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException { 218 throw new ClassNotFoundException(); 219 } 220 221 public void writeExternal(ObjectOutput output) throws IOException { 222 throw new IOException(); 223 } 224 225 } 226 227 /** 228 * @tests java.io.ObjectStreamClass#lookupAny(java.lang.Class) 229 * @since 1.6 230 */ 231 public void test_lookupAnyLjava_lang_Class() { 232 // Test for method java.io.ObjectStreamClass 233 // java.io.ObjectStreamClass.lookupAny(java.lang.Class) 234 ObjectStreamClass osc = ObjectStreamClass.lookupAny(DummyClass.class); 235 assertEquals("lookup returned wrong class: " + osc.getName(), 236 "org.apache.harmony.luni.tests.java.io.ObjectStreamClassTest$DummyClass", osc 237 .getName()); 238 239 osc = ObjectStreamClass.lookupAny(NonSerialzableClass.class); 240 assertEquals("lookup returned wrong class: " + osc.getName(), 241 "org.apache.harmony.luni.tests.java.io.ObjectStreamClassTest$NonSerialzableClass", 242 osc.getName()); 243 244 osc = ObjectStreamClass.lookupAny(ExternalizableClass.class); 245 assertEquals("lookup returned wrong class: " + osc.getName(), 246 "org.apache.harmony.luni.tests.java.io.ObjectStreamClassTest$ExternalizableClass", 247 osc.getName()); 248 249 osc = ObjectStreamClass.lookup(NonSerialzableClass.class); 250 assertNull(osc); 251 252 } 253 254 255} 256