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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 package tests.api.java.io;
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;
29 import java.net.URLClassLoader;
30 import java.lang.reflect.Proxy;
32 import junit.framework.TestCase;
34 public class ObjectStreamClassTest extends TestCase {
36 static class DummyClass implements Serializable {
37 private static final long serialVersionUID = 999999999999999L;
43 public static long getUID() {
44 return serialVersionUID;
49 * @tests java.io.ObjectStreamClass#forClass()
51 public void test_forClass() {
52 // Need to test during serialization to be sure an instance is
54 ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class);
55 assertEquals("forClass returned an object: " + osc.forClass(),
56 DummyClass.class, osc.forClass());
60 * @tests java.io.ObjectStreamClass#getField(java.lang.String)
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
71 * @tests java.io.ObjectStreamClass#getFields()
73 public void test_getFields() {
74 ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class);
75 ObjectStreamField[] osfArray = osc.getFields();
77 "Array of fields should be of length 2 but is instead of length: "
78 + osfArray.length, osfArray.length == 2);
82 * @tests java.io.ObjectStreamClass#getName()
84 public void test_getName() {
85 ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class);
87 "getName returned incorrect name: " + osc.getName(),
88 "tests.api.java.io.ObjectStreamClassTest$DummyClass", // android-changed
93 * @tests java.io.ObjectStreamClass#getSerialVersionUID()
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
103 static class SyntheticTest implements Serializable {
106 private class X implements Serializable {
118 * @tests java.io.ObjectStreamClass#getSerialVersionUID()
120 public void test_getSerialVersionUID_inner_private_class() {
121 ObjectStreamClass osc1 = ObjectStreamClass.lookup(SyntheticTest.class);
122 assertEquals("SyntheticTest unexpected UID: "
123 + osc1.getSerialVersionUID(), 4405770616475181267L, osc1
124 .getSerialVersionUID());
126 ObjectStreamClass osc2 = ObjectStreamClass
127 .lookup(SyntheticTest.X.class);
128 assertEquals("SyntheticTest.X unexpected UID: "
129 + osc2.getSerialVersionUID(), 676101599466902119L, osc2
130 .getSerialVersionUID());
134 * @tests java.io.ObjectStreamClass#getSerialVersionUID()
136 public void test_getSerialVersionUID_classloader() throws Exception {
137 File file = new File(
138 "resources/org/apache/harmony/luni/tests/ObjectStreamClassTest.jar");
139 ClassLoader loader = new URLClassLoader(new URL[] { file.toURL() },
141 Class cl1 = Class.forName("Test1$TestVarArgs", false, loader);
142 ObjectStreamClass osc1 = ObjectStreamClass.lookup(cl1);
143 assertEquals("Test1$TestVarArgs unexpected UID: "
144 + osc1.getSerialVersionUID(), -6051121963037986215L, osc1
145 .getSerialVersionUID());
147 Class cl2 = Class.forName("Test1$TestBridge", false, loader);
148 ObjectStreamClass osc2 = ObjectStreamClass.lookup(cl2);
149 assertEquals("Test1$TestBridge unexpected UID: "
150 + osc2.getSerialVersionUID(), 568585976855071180L, osc2
151 .getSerialVersionUID());
155 * @tests java.io.ObjectStreamClass#lookup(java.lang.Class)
157 public void test_lookupLjava_lang_Class() {
158 ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class);
160 "lookup returned wrong class: " + osc.getName(),
161 "tests.api.java.io.ObjectStreamClassTest$DummyClass", // android-changed
166 * @tests java.io.ObjectStreamClass#toString()
168 public void test_toString() {
169 ObjectStreamClass osc = ObjectStreamClass.lookup(DummyClass.class);
170 String oscString = osc.toString();
172 // The previous test was more specific than the spec so it was replaced
173 // with the test below
174 assertTrue("toString returned incorrect string: " + osc.toString(),
175 oscString.indexOf("serialVersionUID") >= 0
176 && oscString.indexOf("999999999999999L") >= 0);
179 public void testSerialization() {
180 ObjectStreamClass osc = ObjectStreamClass
181 .lookup(ObjectStreamClass.class);
182 assertEquals(0, osc.getFields().length);
185 public void test_specialTypes() {
186 Class<?> proxyClass = Proxy.getProxyClass(this.getClass()
187 .getClassLoader(), new Class[] { Runnable.class });
189 ObjectStreamClass proxyStreamClass = ObjectStreamClass
192 assertEquals("Proxy classes should have zero serialVersionUID", 0,
193 proxyStreamClass.getSerialVersionUID());
194 ObjectStreamField[] proxyFields = proxyStreamClass.getFields();
195 assertEquals("Proxy classes should have no serialized fields", 0,
198 ObjectStreamClass enumStreamClass = ObjectStreamClass
199 .lookup(Thread.State.class);
201 assertEquals("Enum classes should have zero serialVersionUID", 0,
202 enumStreamClass.getSerialVersionUID());
203 ObjectStreamField[] enumFields = enumStreamClass.getFields();
204 assertEquals("Enum classes should have no serialized fields", 0,
211 static class NonSerialzableClass {
212 private static final long serialVersionUID = 1l;
213 public static long getUID() {
214 return serialVersionUID;
221 static class ExternalizableClass implements Externalizable {
223 private static final long serialVersionUID = -4285635779249689129L;
225 public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException {
226 throw new ClassNotFoundException();
229 public void writeExternal(ObjectOutput output) throws IOException {
230 throw new IOException();
236 * @tests java.io.ObjectStreamClass#lookupAny(java.lang.Class)
239 public void test_lookupAnyLjava_lang_Class() {
240 // Test for method java.io.ObjectStreamClass
241 // java.io.ObjectStreamClass.lookupAny(java.lang.Class)
242 ObjectStreamClass osc = ObjectStreamClass.lookupAny(DummyClass.class);
243 assertEquals("lookup returned wrong class: " + osc.getName(),
244 "tests.api.java.io.ObjectStreamClassTest$DummyClass", osc // android-changed
247 osc = ObjectStreamClass.lookupAny(NonSerialzableClass.class);
248 assertEquals("lookup returned wrong class: " + osc.getName(),
249 "tests.api.java.io.ObjectStreamClassTest$NonSerialzableClass", // android-changed
252 osc = ObjectStreamClass.lookupAny(ExternalizableClass.class);
253 assertEquals("lookup returned wrong class: " + osc.getName(),
254 "tests.api.java.io.ObjectStreamClassTest$ExternalizableClass", // android-changed
257 osc = ObjectStreamClass.lookup(NonSerialzableClass.class);