blob: dd8545ba10cbcadae73c172cbdbc87171f7b057a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package tests.api.java.io;
import dalvik.annotation.TestTargets;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetNew;
import dalvik.annotation.TestTargetClass;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.NotActiveException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamClass;
import java.io.ObjectStreamField;
import java.io.Serializable;
import java.io.StreamCorruptedException;
import java.util.Date;
@TestTargetClass(ObjectStreamField.class)
public class ObjectStreamFieldTest extends junit.framework.TestCase {
static class DummyClass implements Serializable {
private static final long serialVersionUID = 999999999999998L;
boolean bField = true;
char cField = 'c';
double dField = 424242.4242;
float fField = 24.12F;
int iField = 1965;
long lField = 9999999L;
short sField = 42;
long bam = 999L;
int ham = 9999;
int sam = 8888;
Object hola = new Object();
public static long getUID() {
return serialVersionUID;
}
}
class MyObjectStreamField extends ObjectStreamField {
public MyObjectStreamField(String name, Class<?> cl) {
super(name, cl);
}
public void setOffset(int newValue) {
super.setOffset(newValue);
}
}
ObjectStreamClass osc;
ObjectStreamField hamField;
ObjectStreamField samField;
ObjectStreamField bamField;
ObjectStreamField holaField;
/**
* @tests java.io.ObjectStreamField#ObjectStreamField(java.lang.String,
* java.lang.Class)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Verifies ObjectStreamField(String, Class<T>)",
method = "ObjectStreamField",
args = {java.lang.String.class, java.lang.Class.class}
)
public void test_ConstructorLjava_lang_StringLjava_lang_Class() {
ObjectStreamField osf = new ObjectStreamField("aField", int.class);
assertTrue("Test 1: Name member not set correctly.",
osf.getName().equals("aField"));
assertTrue("Test 2: Type member not set correctly.",
osf.getType().equals(int.class));
// Repeat the tests with a different object to make sure
// that we have not tested against default values.
osf = new ObjectStreamField("anotherField", String.class);
assertTrue("Test 3: Name member not set correctly.",
osf.getName().equals("anotherField"));
assertTrue("Test 4: Type member not set correctly.",
osf.getType().equals(String.class));
// Invalid argument tests.
try {
osf = new ObjectStreamField(null, boolean.class);
fail("Test 5: NullPointerException expected.");
} catch (NullPointerException e) {
// Expected.
}
try {
osf = new ObjectStreamField("thisField", null);
fail("Test 6: NullPointerException expected.");
} catch (NullPointerException e) {
// Expected.
}
}
/**
* @tests java.io.ObjectStreamField#ObjectStreamField(java.lang.String,
* java.lang.Class)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Verifies ObjectStreamField(String, Class<T>, boolean)",
method = "ObjectStreamField",
args = {java.lang.String.class, java.lang.Class.class, boolean.class}
)
public void test_ConstructorLjava_lang_StringLjava_lang_ClassB() {
ObjectStreamField osf = new ObjectStreamField("aField", int.class, false);
assertTrue("Test 1: Name member not set correctly.",
osf.getName().equals("aField"));
assertTrue("Test 2: Type member not set correctly.",
osf.getType().equals(int.class));
assertFalse("Test 3: Unshared member not set correctly.",
osf.isUnshared());
// Repeat the tests with a different object to make sure
// that we have not tested against default values.
osf = new ObjectStreamField("anotherField", String.class, true);
assertTrue("Test 4: Name member not set correctly.",
osf.getName().equals("anotherField"));
assertTrue("Test 5: Type member not set correctly.",
osf.getType().equals(String.class));
assertTrue("Test 6: Unshared member not set correctly.",
osf.isUnshared());
// Invalid argument tests.
try {
osf = new ObjectStreamField(null, boolean.class);
fail("Test 7: NullPointerException expected.");
} catch (NullPointerException e) {
// Expected.
}
try {
osf = new ObjectStreamField("thisField", null);
fail("Test 8: NullPointerException expected.");
} catch (NullPointerException e) {
// Expected.
}
}
/**
* @tests java.io.ObjectStreamField#compareTo(java.lang.Object)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "compareTo",
args = {java.lang.Object.class}
)
public void test_compareToLjava_lang_Object() {
// Test for method int
// java.io.ObjectStreamField.compareTo(java.lang.Object)
assertTrue("Object compared to int did not return > 0", holaField
.compareTo(hamField) > 0);
assertEquals("Int compared to itself did not return 0", 0, hamField
.compareTo(hamField));
assertTrue("(Int)ham compared to (Int)sam did not return < 0", hamField
.compareTo(samField) < 0);
}
/**
* @tests java.io.ObjectStreamField#getName()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getName",
args = {}
)
public void test_getName() {
// Test for method java.lang.String java.io.ObjectStreamField.getName()
assertEquals("Field did not return correct name", "hola", holaField.getName());
}
/**
* @tests java.io.ObjectStreamField#getOffset()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getOffset",
args = {}
)
public void test_getOffset() {
// Test for method int java.io.ObjectStreamField.getOffset()
ObjectStreamField[] osfArray;
osfArray = osc.getFields();
int[] expectedOffsets = {0, 1, 9, 11, 19, 23, 27, 31, 39, 41, 0};
assertTrue("getOffset() did not return reasonable values.", osfArray[0]
.getOffset() != osfArray[1].getOffset());
for (int i = 0; i < expectedOffsets.length; i++) {
assertEquals(String.format("Unexpected value for osfArray[%d].getOffset(): ", i),
expectedOffsets[i], osfArray[i].getOffset());
}
}
/**
* @tests java.io.ObjectStreamField#getType()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getType",
args = {}
)
public void test_getType() {
// Test for method java.lang.Class java.io.ObjectStreamField.getType()
assertTrue("getType on an Object field did not answer Object",
holaField.getType().equals(Object.class));
}
/**
* @tests java.io.ObjectStreamField#getTypeCode()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getTypeCode",
args = {}
)
public void test_getTypeCode() {
// Test for method char java.io.ObjectStreamField.getTypeCode()
assertEquals("getTypeCode on an Object field did not answer 'L'",
'L', holaField.getTypeCode());
assertEquals("getTypeCode on a long field did not answer 'J'", 'J', bamField
.getTypeCode());
}
/**
* @tests java.io.ObjectStreamField#getTypeString()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getTypeString",
args = {}
)
public void test_getTypeString() {
assertTrue("getTypeString returned: " + holaField.getTypeString(),
holaField.getTypeString().indexOf("Object") >= 0);
assertNull("Primitive types' strings should be null", hamField.getTypeString());
ObjectStreamField osf = new ObjectStreamField("s", String.class, true);
assertTrue(osf.getTypeString() == "Ljava/lang/String;");
}
/**
* @tests java.io.ObjectStreamField#toString()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "toString",
args = {}
)
public void test_toString() {
// Test for method java.lang.String java.io.ObjectStreamField.toString()
assertTrue("toString on a long returned: " + bamField.toString(),
bamField.toString().indexOf("bam") >= 0);
}
/**
* @tests java.io.ObjectStreamField#getType()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getType",
args = {}
)
public void test_getType_Deserialized() throws IOException,
ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(new SerializableObject());
oos.close();
baos.close();
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
SerializableObject obj = (SerializableObject) ois.readObject();
ObjectStreamClass oc = obj.getObjectStreamClass();
ObjectStreamField field = oc.getField("i");
assertEquals(Object.class, field.getType());
}
/**
* @tests java.io.ObjectStreamField#setOffset()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "setOffset",
args = {int.class}
)
public void test_setOffsetI() {
MyObjectStreamField f = new MyObjectStreamField("aField", int.class);
f.setOffset(42);
assertEquals("Test 1: Unexpected offset value.", 42, f.getOffset());
f.setOffset(2008);
assertEquals("Test 2: Unexpected offset value.", 2008, f.getOffset());
}
/**
* @tests java.io.ObjectStreamField#getType()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getType",
args = {}
)
public void test_getType_MockObjectInputStream() throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(new SerializableObject());
oos.close();
baos.close();
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
MockObjectInputStream ois = new MockObjectInputStream(bais);
ois.readObject();
ObjectStreamClass oc = ois.getObjectStreamClass();
ObjectStreamField field = oc.getField("i");
assertEquals(Object.class, field.getType());
}
/**
* @tests java.io.ObjectStreamField#isPrimitive()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "isPrimitive",
args = {}
)
public void test_isPrimitive() {
// Test for method int java.io.ObjectStreamField.getOffset()
ObjectStreamField[] osfArray;
osfArray = osc.getFields();
for (int i = 0; i < (osfArray.length - 1); i++) {
assertTrue(String.format("osfArray[%d].isPrimitive() should return true.", i),
osfArray[i].isPrimitive());
}
assertFalse(String.format("osfArray[%d].isPrimitive() should return false.",
osfArray.length - 1),
osfArray[(osfArray.length - 1)].isPrimitive());
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "isUnshared",
args = {}
)
public void test_isUnshared() throws Exception {
SerializableObject2 obj = new SerializableObject2();
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.close();
baos.close();
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
SerializableObject2 newObj = (SerializableObject2) ois.readObject();
ObjectInputStream.GetField getField = newObj.getGetField();
ObjectStreamClass objectStreamClass = getField.getObjectStreamClass();
assertTrue(objectStreamClass.getField("i").isUnshared());
assertFalse(objectStreamClass.getField("d").isUnshared());
assertTrue(objectStreamClass.getField("s").isUnshared());
assertEquals(1000, getField.get("i", null));
assertEquals(SerializableObject2.today, getField.get("d", null));
assertEquals("Richard", getField.get("s", null));
assertTrue(objectStreamClass.getField("s").getTypeString() == "Ljava/lang/String;");
assertEquals(0, objectStreamClass.getField("d").getOffset());
assertEquals(1, objectStreamClass.getField("i").getOffset());
assertEquals(2, objectStreamClass.getField("s").getOffset());
}
/**
* Sets up the fixture, for example, open a network connection. This method
* is called before a test is executed.
*/
protected void setUp() {
osc = ObjectStreamClass.lookup(DummyClass.class);
bamField = osc.getField("bam");
samField = osc.getField("sam");
hamField = osc.getField("ham");
holaField = osc.getField("hola");
}
/**
* Tears down the fixture, for example, close a network connection. This
* method is called after a test is executed.
*/
protected void tearDown() {
}
}
class SerializableObject implements Serializable {
public ObjectInputStream.GetField getField = null;
private static final long serialVersionUID = -2953957835918368056L;
public Date d;
public Integer i;
public Exception e;
public SerializableObject() {
d = new Date();
i = new Integer(1);
e = new Exception("e");
}
private void writeObject(ObjectOutputStream o) throws IOException {
o.putFields().put("d", new Date());
o.putFields().put("i", new Integer(11));
o.writeFields();
}
private void readObject(ObjectInputStream in) throws NotActiveException,
IOException, ClassNotFoundException {
getField = in.readFields();
d = (Date) getField.get("d", null);
i = (Integer) getField.get("i", null);
}
public ObjectStreamClass getObjectStreamClass() {
return getField.getObjectStreamClass();
}
}
class MockObjectInputStream extends ObjectInputStream {
private ObjectStreamClass temp = null;
public MockObjectInputStream() throws SecurityException, IOException {
super();
}
public MockObjectInputStream(InputStream in)
throws StreamCorruptedException, IOException {
super(in);
}
public ObjectStreamClass readClassDescriptor() throws IOException,
ClassNotFoundException {
ObjectStreamClass osc = super.readClassDescriptor();
//To get the ObjectStreamClass of SerializableObject
if (osc.getSerialVersionUID() == -2953957835918368056L) {
temp = osc;
}
return osc;
}
public ObjectStreamClass getObjectStreamClass() {
return temp;
}
}
class SerializableObject2 implements Serializable {
private static final long serialVersionUID = 1L;
private static final ObjectStreamField[] serialPersistentFields = {
new ObjectStreamField("i", Integer.class, true),
new ObjectStreamField("d", Date.class, false),
new ObjectStreamField("s", String.class, true),
};
private ObjectInputStream.GetField getField;
public static Date today = new Date(1172632429156l);
public ObjectInputStream.GetField getGetField() {
return getField;
}
private void writeObject(ObjectOutputStream o) throws IOException {
ObjectOutputStream.PutField putField = o.putFields();
putField.put("i", new Integer(1000));
putField.put("d", today);
putField.put("s", "Richard");
o.writeFields();
}
private void readObject(ObjectInputStream in) throws NotActiveException,
IOException, ClassNotFoundException {
getField = in.readFields();
}
}