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