• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.luni.tests.java.io;
19 
20 import java.io.ByteArrayInputStream;
21 import java.io.ByteArrayOutputStream;
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.io.NotActiveException;
25 import java.io.ObjectInputStream;
26 import java.io.ObjectOutputStream;
27 import java.io.ObjectStreamClass;
28 import java.io.ObjectStreamField;
29 import java.io.OutputStream;
30 import java.io.Serializable;
31 import java.io.StreamCorruptedException;
32 import java.util.Date;
33 
34 public class ObjectStreamFieldTest extends junit.framework.TestCase {
35 
36     static class DummyClass implements Serializable {
37         private static final long serialVersionUID = 999999999999998L;
38 
39         long bam = 999L;
40 
41         int ham = 9999;
42 
43         int sam = 8888;
44 
45         Object hola = new Object();
46 
getUID()47         public static long getUID() {
48             return serialVersionUID;
49         }
50     }
51 
52     ObjectStreamClass osc;
53 
54     ObjectStreamField hamField;
55 
56     ObjectStreamField samField;
57 
58     ObjectStreamField bamField;
59 
60     ObjectStreamField holaField;
61 
62     /**
63      * @tests java.io.ObjectStreamField#ObjectStreamField(java.lang.String,
64      *        java.lang.Class)
65      */
test_ConstructorLjava_lang_StringLjava_lang_Class()66     public void test_ConstructorLjava_lang_StringLjava_lang_Class() {
67         assertTrue("Used to test", true);
68     }
69 
test_equalsLjava_lang_Object()70     public void test_equalsLjava_lang_Object() {
71         // Regression test for HARMONY-4273
72         assertTrue(samField.equals(samField));
73         assertFalse(samField.equals(hamField));
74         assertFalse(samField.equals("fish"));
75         assertFalse(samField.equals(null));
76     }
77 
78     /**
79      * @tests java.io.ObjectStreamField#compareTo(java.lang.Object)
80      */
test_compareToLjava_lang_Object()81     public void test_compareToLjava_lang_Object() {
82         assertTrue("Object compared to int did not return > 0", holaField
83                 .compareTo(hamField) > 0);
84         assertEquals("Int compared to itself did not return 0", 0, hamField
85                 .compareTo(hamField));
86         assertTrue("(Int)ham compared to (Int)sam did not return < 0", hamField
87                 .compareTo(samField) < 0);
88     }
89 
90     /**
91      * @tests java.io.ObjectStreamField#getName()
92      */
test_getName()93     public void test_getName() {
94         assertEquals("Field did not return correct name", "hola", holaField
95                 .getName());
96     }
97 
98     /**
99      * @tests java.io.ObjectStreamField#getOffset()
100      */
test_getOffset()101     public void test_getOffset() {
102         ObjectStreamField[] osfArray;
103         osfArray = osc.getFields();
104         assertTrue("getOffset did not return reasonable values", osfArray[0]
105                 .getOffset() != osfArray[1].getOffset());
106         assertEquals("getOffset for osfArray[0].getOffset() did not return 0",
107                 0, osfArray[0].getOffset());
108         assertEquals("osfArray[1].getOffset() did not return	8", 8, osfArray[1]
109                 .getOffset());
110         assertEquals("osfArray[2].getOffset() did not return 12", 12,
111                 osfArray[2].getOffset());
112     }
113 
114     /**
115      * @tests java.io.ObjectStreamField#getType()
116      */
test_getType()117     public void test_getType() {
118         assertTrue("getType on an Object field did not answer Object",
119                 holaField.getType().equals(Object.class));
120     }
121 
122     /**
123      * @tests java.io.ObjectStreamField#getTypeCode()
124      */
test_getTypeCode()125     public void test_getTypeCode() {
126         assertEquals("getTypeCode on an Object field did not answer 'L'", 'L',
127                 holaField.getTypeCode());
128         assertEquals("getTypeCode on a long field did not answer 'J'", 'J',
129                 bamField.getTypeCode());
130     }
131 
132     /**
133      * @tests java.io.ObjectStreamField#getTypeString()
134      */
test_getTypeString()135     public void test_getTypeString() {
136         assertTrue("getTypeString returned: " + holaField.getTypeString(),
137                 holaField.getTypeString().indexOf("Object") >= 0);
138         assertNull("Primitive types' strings should be null", hamField
139                 .getTypeString());
140 
141         ObjectStreamField osf = new ObjectStreamField("s", String.class, true);
142         assertTrue(osf.getTypeString() == "Ljava/lang/String;");
143     }
144 
145     /**
146      * @tests java.io.ObjectStreamField#toString()
147      */
test_toString()148     public void test_toString() {
149         assertTrue("toString on a long returned: " + bamField.toString(),
150                 bamField.toString().indexOf("bam") >= 0);
151     }
152 
153     /**
154      * @tests java.io.ObjectStreamField#getType()
155      */
test_getType_Deserialized()156     public void test_getType_Deserialized() throws IOException,
157             ClassNotFoundException {
158         ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
159         ObjectOutputStream oos = new ObjectOutputStream(baos);
160         oos.writeObject(new SerializableObject());
161         oos.close();
162         baos.close();
163 
164         byte[] bytes = baos.toByteArray();
165         ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
166         ObjectInputStream ois = new ObjectInputStream(bais);
167         SerializableObject obj = (SerializableObject) ois.readObject();
168 
169         ObjectStreamClass oc = obj.getObjectStreamClass();
170         ObjectStreamField field = oc.getField("i");
171         assertEquals(Object.class, field.getType());
172     }
173 
174     /**
175      * @tests java.io.ObjectStreamField#getType()
176      */
test_getType_MockObjectInputStream()177     public void test_getType_MockObjectInputStream() throws IOException,
178             ClassNotFoundException {
179         ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
180         ObjectOutputStream oos = new ObjectOutputStream(baos);
181         oos.writeObject(new SerializableObject());
182         oos.close();
183         baos.close();
184 
185         byte[] bytes = baos.toByteArray();
186         ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
187         MockObjectInputStream ois = new MockObjectInputStream(bais);
188         ois.readObject();
189 
190         ObjectStreamClass oc = ois.getObjectStreamClass();
191         ObjectStreamField field = oc.getField("i");
192         assertEquals(Object.class, field.getType());
193     }
194 
test_isUnshared()195     public void test_isUnshared() throws Exception {
196         SerializableObject2 obj = new SerializableObject2();
197 
198         ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
199         ObjectOutputStream oos = new ObjectOutputStream(baos);
200         oos.writeObject(obj);
201         oos.close();
202         baos.close();
203         byte[] bytes = baos.toByteArray();
204         ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
205         ObjectInputStream ois = new ObjectInputStream(bais);
206         SerializableObject2 newObj = (SerializableObject2) ois.readObject();
207 
208         ObjectInputStream.GetField getField = newObj.getGetField();
209         ObjectStreamClass objectStreamClass = getField.getObjectStreamClass();
210 
211         assertTrue(objectStreamClass.getField("i").isUnshared());
212         assertFalse(objectStreamClass.getField("d").isUnshared());
213         assertTrue(objectStreamClass.getField("s").isUnshared());
214 
215         assertEquals(1000, getField.get("i", null));
216         assertEquals(SerializableObject2.today, getField.get("d", null));
217         assertEquals("Richard", getField.get("s", null));
218 
219         assertTrue(objectStreamClass.getField("s").getTypeString() == "Ljava/lang/String;");
220 
221         assertEquals(0, objectStreamClass.getField("d").getOffset());
222         assertEquals(1, objectStreamClass.getField("i").getOffset());
223         assertEquals(2, objectStreamClass.getField("s").getOffset());
224     }
225 
226 
227     /**
228      * Write/serialize and read/de-serialize an object with primitive field
229      */
test_ObjectWithPrimitiveField()230     public void test_ObjectWithPrimitiveField()
231         throws IOException, ClassNotFoundException {
232 
233         final ByteArrayOutputStream baos = new ByteArrayOutputStream();
234         final MyObjectOutputStream oos = new MyObjectOutputStream(baos);
235         oos.writeObject(new MockClass());
236         final byte[] bytes = baos.toByteArray();
237         final ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
238         final MyObjectInputStream ois = new MyObjectInputStream(bais);
239         // NullPointerException is thrown by the readObject call below.
240         ois.readObject();
241     }
242 
243     /**
244      * Sets up the fixture, for example, open a network connection. This method
245      * is called before a test is executed.
246      */
setUp()247     protected void setUp() {
248         osc = ObjectStreamClass.lookup(DummyClass.class);
249         bamField = osc.getField("bam");
250         samField = osc.getField("sam");
251         hamField = osc.getField("ham");
252         holaField = osc.getField("hola");
253     }
254 }
255 
256 class SerializableObject implements Serializable {
257     public ObjectInputStream.GetField getField = null;
258 
259     private static final long serialVersionUID = -2953957835918368056L;
260 
261     public Date d;
262 
263     public Integer i;
264 
265     public Exception e;
266 
SerializableObject()267     public SerializableObject() {
268         d = new Date();
269         i = new Integer(1);
270         e = new Exception("e");
271     }
272 
writeObject(ObjectOutputStream o)273     private void writeObject(ObjectOutputStream o) throws IOException {
274         o.putFields().put("d", new Date());
275         o.putFields().put("i", new Integer(11));
276         o.writeFields();
277     }
278 
readObject(ObjectInputStream in)279     private void readObject(ObjectInputStream in) throws NotActiveException,
280             IOException, ClassNotFoundException {
281         getField = in.readFields();
282         d = (Date) getField.get("d", null);
283         i = (Integer) getField.get("i", null);
284     }
285 
getObjectStreamClass()286     public ObjectStreamClass getObjectStreamClass() {
287         return getField.getObjectStreamClass();
288     }
289 }
290 
291 class MockObjectInputStream extends ObjectInputStream {
292     private ObjectStreamClass temp = null;
293 
MockObjectInputStream()294     public MockObjectInputStream() throws SecurityException, IOException {
295         super();
296     }
297 
MockObjectInputStream(InputStream in)298     public MockObjectInputStream(InputStream in)
299             throws StreamCorruptedException, IOException {
300         super(in);
301     }
302 
readClassDescriptor()303     public ObjectStreamClass readClassDescriptor() throws IOException,
304             ClassNotFoundException {
305         ObjectStreamClass osc = super.readClassDescriptor();
306         // To get the ObjectStreamClass of SerializableObject
307         if (osc.getSerialVersionUID() == -2953957835918368056L) {
308             temp = osc;
309         }
310         return osc;
311     }
312 
getObjectStreamClass()313     public ObjectStreamClass getObjectStreamClass() {
314         return temp;
315     }
316 }
317 
318 class SerializableObject2 implements Serializable {
319 
320     private static final long serialVersionUID = 1L;
321 
322     private static final ObjectStreamField[] serialPersistentFields = {
323             new ObjectStreamField("i", Integer.class, true),
324             new ObjectStreamField("d", Date.class, false),
325             new ObjectStreamField("s", String.class, true), };
326 
327     private ObjectInputStream.GetField getField;
328 
329     public static Date today = new Date(1172632429156l);
330 
getGetField()331     public ObjectInputStream.GetField getGetField() {
332         return getField;
333     }
334 
writeObject(ObjectOutputStream o)335     private void writeObject(ObjectOutputStream o) throws IOException {
336         ObjectOutputStream.PutField putField = o.putFields();
337         putField.put("i", new Integer(1000));
338         putField.put("d", today);
339         putField.put("s", "Richard");
340         o.writeFields();
341     }
342 
readObject(ObjectInputStream in)343     private void readObject(ObjectInputStream in) throws NotActiveException,
344             IOException, ClassNotFoundException {
345         getField = in.readFields();
346     }
347 }
348 
349 
350 // Primitive fields are necessary to cause the NullPointerException.
351 class MockClass implements Serializable {
352     String str1 = "string 1";
353     String str2 = "string 2";
354     int int1 = 1;
355     int int2 = 2;
356     String str3 = "string 3";
357 }
358 
359 
360 // Overrides writeClassDescriptor to store ObjectStreamClass in map.
361 class MyObjectOutputStream extends ObjectOutputStream {
362 
363     // record the only ObjectStreamClass
364     static ObjectStreamClass descs;
365 
MyObjectOutputStream(OutputStream out)366     MyObjectOutputStream(OutputStream out)
367         throws IOException {
368         super(out);
369     }
370 
371     @Override
writeClassDescriptor(ObjectStreamClass desc)372     protected void writeClassDescriptor(ObjectStreamClass desc)
373         throws IOException {
374         descs = desc;
375         // Write a int
376         writeInt(1);
377     }
378 }
379 
380 // Overrides readClassDescriptor to get ObjectStreamClass from map.
381 class MyObjectInputStream extends ObjectInputStream {
382 
MyObjectInputStream(InputStream in)383     MyObjectInputStream(InputStream in)
384         throws IOException {
385         super(in);
386     }
387 
388     @Override
readClassDescriptor()389     protected ObjectStreamClass readClassDescriptor()
390         throws IOException, ClassNotFoundException {
391         // Read a integer and get the only ObjectStreamClass for the test
392         final int id = readInt();
393         return MyObjectOutputStream.descs;
394     }
395 }
396