package org.limewire.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import junit.framework.Test; public class ConverterObjectInputStreamTest extends BaseTestCase { public ConverterObjectInputStreamTest(String name) { super(name); } public static Test suite() { return buildTestSuite(ConverterObjectInputStreamTest.class); } private ConverterObjectInputStream getSerializedInputStream(Serializable s) throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream objectStream = new ObjectOutputStream(out); objectStream.writeObject(s); objectStream.flush(); objectStream.close(); return getSerializedInputStream(out); } private ConverterObjectInputStream getSerializedInputStream(byte[] out) throws Exception { return new ConverterObjectInputStream(new ByteArrayInputStream(out)); } private ConverterObjectInputStream getSerializedInputStream(ByteArrayOutputStream out) throws Exception { return getSerializedInputStream(out.toByteArray()); } @SuppressWarnings("unchecked") public void testLookupOfUnregisteredClass() throws Exception { ArrayList<SerializableClass> list = new ArrayList<SerializableClass>(); list.add(new SerializableClass()); ConverterObjectInputStream in = getSerializedInputStream(list); ArrayList<SerializableClass> list2 = (ArrayList<SerializableClass>)in.readObject(); assertEquals(list.size(), list2.size()); } public void testAddedClassMapping() throws Exception { ConverterObjectInputStream in = getSerializedInputStream(new SerializableClass()); in.addLookup(SerializableClass.class.getName(), NewSerializableClass.class.getName()); Object instance = in.readObject(); assertTrue(instance instanceof NewSerializableClass); } private void assertObjectIsNotConstructable(byte[] in, String expectedClassName) throws Exception { // verify object can't be deserialized by normal ObjectInputStream try { ObjectInputStream normalIn = new ObjectInputStream(new ByteArrayInputStream(in)); normalIn.readObject(); fail("exception should have been thrown"); } catch (ClassNotFoundException cnfe) { assertEquals(cnfe.getMessage(), expectedClassName); } } public void testOldCollectionClasses() throws Exception { // import com.sun.java.util.collections.*; // ArrayList list = new ArrayList(); // list.add(new HashMap()); byte[] hashMapInsideOfArrayList = new byte[] { -84, -19, 0, 5, 115, 114, 0, 39, 99, 111, 109, 46, 115, 117, 110, 46, 106, 97, 118, 97, 46, 117, 116, 105, 108, 46, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 115, 46, 65, 114, 114, 97, 121, 76, 105, 115, 116, 77, -94, -80, -33, 64, 10, 78, -108, 3, 0, 1, 73, 0, 4, 115, 105, 122, 101, 120, 112, 0, 0, 0, 1, 119, 4, 0, 0, 0, 10, 115, 114, 0, 37, 99, 111, 109, 46, 115, 117, 110, 46, 106, 97, 118, 97, 46, 117, 116, 105, 108, 46, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 115, 46, 72, 97, 115, 104, 77, 97, 112, 80, 0, 33, 58, -95, -15, 79, 40, 3, 0, 2, 70, 0, 10, 108, 111, 97, 100, 70, 97, 99, 116, 111, 114, 73, 0, 9, 116, 104, 114, 101, 115, 104, 111, 108, 100, 120, 112, 63, 64, 0, 0, 0, 0, 0, 75, 119, 8, 0, 0, 0, 101, 0, 0, 0, 0, 120, 120 }; assertObjectIsNotConstructable(hashMapInsideOfArrayList, "com.sun.java.util.collections.ArrayList"); ConverterObjectInputStream in = getSerializedInputStream(hashMapInsideOfArrayList); Object instance = in.readObject(); assertTrue(instance instanceof ArrayList); ArrayList list = (ArrayList)instance; assertEquals(1, list.size()); instance = list.get(0); assertTrue(instance instanceof HashMap); } public void testDefaultPackageClassMappedToThisPackage() throws Exception { // serializable static inner class in default package // new ConverterObjectInputStreamTest.SerializableClass(); byte[] serializbleClassInDefaultPackage = new byte[] { -84, -19, 0, 5, 115, 114, 0, 48, 67, 111, 110, 118, 101, 114, 116, 101, 114, 79, 98, 106, 101, 99, 116, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 84, 101, 115, 116, 36, 83, 101, 114, 105, 97, 108, 105, 122, 97, 98, 108, 101, 67, 108, 97, 115, 115, -6, 49, 117, -36, -108, -33, -69, 70, 2, 0, 0, 120, 112 }; assertObjectIsNotConstructable(serializbleClassInDefaultPackage, "ConverterObjectInputStreamTest$SerializableClass"); ConverterObjectInputStream in = getSerializedInputStream(serializbleClassInDefaultPackage); in.addLookup("", this.getClass().getName().substring(0, this.getClass().getName().lastIndexOf('.'))); Object instance = in.readObject(); assertTrue(instance instanceof SerializableClass); } static class SerializableClass implements Serializable { } static class NewSerializableClass implements Serializable { } }