/* * Copyright 1999-2011 Alibaba Group. * * Licensed 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 com.alibaba.dubbo.common.serialize.serialization; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Time; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; import org.junit.Test; import com.alibaba.dubbo.common.URL; import com.alibaba.dubbo.common.model.AnimalEnum; import com.alibaba.dubbo.common.model.BizException; import com.alibaba.dubbo.common.model.BizExceptionNoDefaultConstructor; import com.alibaba.dubbo.common.model.SerializablePerson; import com.alibaba.dubbo.common.model.media.Image; import com.alibaba.dubbo.common.model.media.Image.Size; import com.alibaba.dubbo.common.model.media.Media; import com.alibaba.dubbo.common.model.media.Media.Player; import com.alibaba.dubbo.common.model.media.MediaContent; import com.alibaba.dubbo.common.model.person.BigPerson; import com.alibaba.dubbo.common.model.person.FullAddress; import com.alibaba.dubbo.common.model.person.PersonInfo; import com.alibaba.dubbo.common.model.person.PersonStatus; import com.alibaba.dubbo.common.model.person.Phone; import com.alibaba.dubbo.common.serialize.ObjectInput; import com.alibaba.dubbo.common.serialize.ObjectOutput; import com.alibaba.dubbo.common.serialize.Serialization; /** * @author ding.lid */ public abstract class AbstractSerializationTest { Serialization serialization; URL url = new URL("protocl", "1.1.1.1", 1234); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); static Random random = new Random(); // ================ Primitive Type ================ @Test public void test_Bool() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeBool(false); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertFalse(deserialize.readBool()); try { deserialize.readBool(); fail(); } catch (IOException expected) { } } @Test public void test_Bool_Multi() throws Exception { boolean[] array = new boolean[100]; for (int i = 0; i < array.length; i++) { array[i] = random.nextBoolean(); } ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); for (boolean b : array) { objectOutput.writeBool(b); } objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); for (boolean b : array) { assertEquals(b, deserialize.readBool()); } try { deserialize.readBool(); fail(); } catch (IOException expected) { } } @Test public void test_Byte() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeByte((byte) 123); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertEquals((byte) 123, deserialize.readByte()); try { deserialize.readByte(); fail(); } catch (IOException expected) { } } @Test public void test_Byte_Multi() throws Exception { byte[] array = new byte[100]; random.nextBytes(array); ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); for (byte b : array) { objectOutput.writeByte(b); } objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); for (byte b : array) { assertEquals(b, deserialize.readByte()); } try { deserialize.readByte(); fail(); } catch (IOException expected) { } } @Test public void test_Short() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeShort((short) 123); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertEquals((short) 123, deserialize.readShort()); try { deserialize.readShort(); fail(); } catch (IOException expected) { } } @Test public void test_Integer() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeInt(1); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); int i = deserialize.readInt(); assertEquals(1, i); try { deserialize.readInt(); fail(); } catch (IOException expected) { } } @Test public void test_Long() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeLong(123L); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertEquals(123L, deserialize.readLong()); try { deserialize.readLong(); fail(); } catch (IOException expected) { } } @Test public void test_Float() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeFloat(1.28F); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertTrue(1.28F == deserialize.readFloat()); try { deserialize.readFloat(); fail(); } catch (IOException expected) { } } @Test public void test_Double() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeDouble(1.28); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertTrue(1.28 == deserialize.readDouble()); try { deserialize.readDouble(); fail(); } catch (IOException expected) { } } @Test public void test_UtfString() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeUTF("123中华人民共和国"); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertEquals("123中华人民共和国", deserialize.readUTF()); try { deserialize.readUTF(); fail(); } catch (IOException expected) { } } @Test public void test_Bytes() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeBytes("123中华人民共和国".getBytes()); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals("123中华人民共和国".getBytes(), deserialize.readBytes()); try { deserialize.readBytes(); fail(); } catch (IOException expected) { } } @Test public void test_BytesRange() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeBytes("123中华人民共和国-新疆维吾尔自治区".getBytes(), 1, 9); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); byte[] expectedArray = new byte[9]; System.arraycopy("123中华人民共和国-新疆维吾尔自治区".getBytes(), 1, expectedArray, 0, expectedArray.length); assertArrayEquals(expectedArray, deserialize.readBytes()); try { deserialize.readBytes(); fail(); } catch (IOException expected) {} } // ================== Util methods ================== <T> void assertObjectArray(T[] data, Class<T[]> clazz) throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, clazz.cast(deserialize.readObject())); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } <T> void assertObjectArrayWithType(T[] data, Class<T[]> clazz) throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, clazz.cast(deserialize.readObject(clazz))); try { deserialize.readObject(clazz); fail(); } catch (IOException expected) { } } @SuppressWarnings("unchecked") <T> void assertObject(T data) throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertEquals(data, (T) deserialize.readObject()); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } <T> void assertObjectWithType(T data, Class<T> clazz) throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertEquals(data, (T) deserialize.readObject(clazz)); try { deserialize.readObject(clazz); fail(); } catch (IOException expected) { } } // ================ Array Type ================ @Test public void test_boolArray() throws Exception { boolean[] data = new boolean[] { true, false, true}; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertTrue(Arrays.equals(data, (boolean[]) deserialize.readObject())); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } @Test public void test_boolArray_withType() throws Exception { boolean[] data = new boolean[] { true, false, true}; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertTrue(Arrays.equals(data, (boolean[]) deserialize.readObject(boolean[].class))); try { deserialize.readObject(boolean[].class); fail(); } catch (IOException expected) { } } @Test public void test_charArray() throws Exception { char[] data = new char[] { 'a', '中', '无' }; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, (char[]) deserialize.readObject()); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } @Test public void test_charArray_withType() throws Exception { char[] data = new char[] { 'a', '中', '无' }; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, (char[]) deserialize.readObject(char[].class)); try { deserialize.readObject(char[].class); fail(); } catch (IOException expected) { } } @Test public void test_shortArray() throws Exception { short[] data = new short[] { 37, 39, 12 }; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, (short[]) deserialize.readObject()); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } @Test public void test_shortArray_withType() throws Exception { short[] data = new short[] { 37, 39, 12 }; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, (short[]) deserialize.readObject(short[].class)); try { deserialize.readObject(short[].class); fail(); } catch (IOException expected) { } } @Test public void test_intArray() throws Exception { int[] data = new int[] { 234, 0, -1}; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, (int[]) deserialize.readObject()); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } @Test public void test_intArray_withType() throws Exception { int[] data = new int[] { 234, 0, -1}; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, (int[]) deserialize.readObject(int[].class)); try { deserialize.readObject(int[].class); fail(); } catch (IOException expected) { } } @Test public void test_longArray() throws Exception { long[] data = new long[] { 234, 0, -1}; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, (long[]) deserialize.readObject()); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } @Test public void test_longArray_withType() throws Exception { long[] data = new long[] { 234, 0, -1}; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, (long[]) deserialize.readObject(long[].class)); try { deserialize.readObject(long[].class); fail(); } catch (IOException expected) { } } @Test public void test_floatArray() throws Exception { float[] data = new float[] { 37F, -3.14F, 123456.7F }; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, (float[]) deserialize.readObject(), 0.0001F); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } @Test public void test_floatArray_withType() throws Exception { float[] data = new float[] { 37F, -3.14F, 123456.7F }; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, (float[]) deserialize.readObject(float[].class), 0.0001F); try { deserialize.readObject(float[].class); fail(); } catch (IOException expected) { } } @Test public void test_doubleArray() throws Exception { double[] data = new double[] { 37D, -3.14D, 123456.7D }; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, (double[]) deserialize.readObject(), 0.0001); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } @Test public void test_doubleArray_withType() throws Exception { double[] data = new double[] { 37D, -3.14D, 123456.7D }; ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertArrayEquals(data, (double[]) deserialize.readObject(double[].class), 0.0001); try { deserialize.readObject(double[].class); fail(); } catch (IOException expected) { } } @Test public void test_StringArray() throws Exception { assertObjectArray(new String[] { "1", "b" }, String[].class); } @Test public void test_StringArray_withType() throws Exception { assertObjectArrayWithType(new String[] { "1", "b" }, String[].class); } @Test public void test_IntegerArray() throws Exception { assertObjectArray(new Integer[] { 234, 0, -1}, Integer[].class); } @Test public void test_IntegerArray_withType() throws Exception { assertObjectArrayWithType(new Integer[] { 234, 0, -1}, Integer[].class); } @Test public void test_EnumArray() throws Exception { assertObjectArray(new AnimalEnum[] { AnimalEnum.bull, AnimalEnum.cat, AnimalEnum.dog, AnimalEnum.horse}, AnimalEnum[].class); } @Test public void test_EnumArray_withType() throws Exception { assertObjectArrayWithType(new AnimalEnum[] { AnimalEnum.bull, AnimalEnum.cat, AnimalEnum.dog, AnimalEnum.horse}, AnimalEnum[].class); } // ================ Simple Type ================ @Test public void test_SPerson() throws Exception { assertObject(new SerializablePerson()); } @Test public void test_SPerson_withType() throws Exception { assertObjectWithType(new SerializablePerson(), SerializablePerson.class); } @Test public void test_BizException() throws Exception { BizException e = new BizException("Hello"); ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(e); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); Object read = deserialize.readObject(); assertEquals("Hello", ((BizException) read).getMessage()); } @Test public void test_BizException_WithType() throws Exception { BizException e = new BizException("Hello"); ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(e); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); Object read = deserialize.readObject(BizException.class); assertEquals("Hello", ((BizException) read).getMessage()); } @Test public void test_BizExceptionNoDefaultConstructor() throws Exception { BizExceptionNoDefaultConstructor e = new BizExceptionNoDefaultConstructor("Hello"); ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(e); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); Object read = deserialize.readObject(); assertEquals("Hello", ((BizExceptionNoDefaultConstructor) read).getMessage()); } @Test public void test_BizExceptionNoDefaultConstructor_WithType() throws Exception { BizExceptionNoDefaultConstructor e = new BizExceptionNoDefaultConstructor("Hello"); ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(e); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); Object read = deserialize.readObject(BizExceptionNoDefaultConstructor.class); assertEquals("Hello", ((BizExceptionNoDefaultConstructor) read).getMessage()); } @Test public void test_enum() throws Exception { assertObject(AnimalEnum.dog); } @Test public void test_enum_withType() throws Exception { assertObjectWithType(AnimalEnum.dog, AnimalEnum.class); } @Test public void test_Date() throws Exception { assertObject(new Date()); } @Test public void test_Date_withType() throws Exception { assertObjectWithType(new Date(), Date.class); } @Test public void test_Time() throws Exception { assertObject(new Time(System.currentTimeMillis())); } @Test public void test_Time_withType() throws Exception { assertObjectWithType(new Time(System.currentTimeMillis()), Time.class); } @Test public void test_ByteWrap() throws Exception { assertObject(new Byte((byte) 12)); } @Test public void test_ByteWrap_withType() throws Exception { assertObjectWithType(new Byte((byte) 12), Byte.class); } @Test public void test_LongWrap() throws Exception { assertObject(new Long(12)); } @Test public void test_LongWrap_withType() throws Exception { assertObjectWithType(new Long(12), Long.class); } @Test public void test_BigInteger() throws Exception { assertObject(new BigInteger("23423434234234234")); } @Test public void test_BigInteger_withType() throws Exception { assertObjectWithType(new BigInteger("23423434234234234"), BigInteger.class); } @Test public void test_BigDecimal() throws Exception { assertObject(new BigDecimal("23423434234234234.341274832341234235")); } @Test public void test_BigDecimal_withType() throws Exception { assertObjectWithType(new BigDecimal("23423434234234234.341274832341234235"), BigDecimal.class); } @Test public void test_StringList_asListReturn() throws Exception { List<String> args = Arrays.asList(new String[] { "1", "b" }); assertObject(args); } @Test public void test_StringArrayList() throws Exception { List<String> args = new ArrayList<String>(Arrays.asList(new String[] { "1", "b" })); assertObject(args); } @Test public void test_StringSet() throws Exception { Set<String> args = new HashSet<String>(); args.add("1"); assertObject(args); } @Test public void test_LinkedHashMap() throws Exception { LinkedHashMap<String, String> data = new LinkedHashMap<String, String>(); data.put("1", "a"); data.put("2", "b"); ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); Object read = deserialize.readObject(); assertTrue(read instanceof LinkedHashMap); @SuppressWarnings("unchecked") String key1 = ((LinkedHashMap<String, String>)read).entrySet().iterator().next().getKey(); assertEquals("1", key1); assertEquals(data, read); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } @Test public void test_SPersonList() throws Exception { List<SerializablePerson> args = new ArrayList<SerializablePerson>(); args.add(new SerializablePerson()); assertObject(args); } @Test public void test_SPersonSet() throws Exception { Set<SerializablePerson> args = new HashSet<SerializablePerson>(); args.add(new SerializablePerson()); assertObject(args); } @Test public void test_IntSPersonMap() throws Exception { Map<Integer, SerializablePerson> args = new HashMap<Integer, SerializablePerson>(); args.put(1, new SerializablePerson()); assertObject(args); } @Test public void test_StringSPersonMap() throws Exception { Map<String, SerializablePerson> args = new HashMap<String, SerializablePerson>(); args.put("1", new SerializablePerson()); assertObject(args); } // ================ Complex Collection Type ================ @Test public void test_StringSPersonListMap() throws Exception { Map<String, List<SerializablePerson>> args = new HashMap<String, List<SerializablePerson>>(); List<SerializablePerson> sublist = new ArrayList<SerializablePerson>(); sublist.add(new SerializablePerson()); args.put("1", sublist); assertObject(args); } @Test public void test_SPersonListList() throws Exception { List<List<SerializablePerson>> args = new ArrayList<List<SerializablePerson>>(); List<SerializablePerson> sublist = new ArrayList<SerializablePerson>(); sublist.add(new SerializablePerson()); args.add(sublist); assertObject(args); } // ================ complex POJO ============= BigPerson bigPerson; { bigPerson = new BigPerson(); bigPerson.setPersonId("superman111"); bigPerson.setLoginName("superman"); bigPerson.setStatus(PersonStatus.ENABLED); bigPerson.setEmail("sm@1.com"); bigPerson.setPenName("pname"); ArrayList<Phone> phones = new ArrayList<Phone>(); Phone phone1 = new Phone("86", "0571", "87654321", "001"); Phone phone2 = new Phone("86", "0571", "87654322", "002"); phones.add(phone1); phones.add(phone2); PersonInfo pi = new PersonInfo(); pi.setPhones(phones); Phone fax = new Phone("86", "0571", "87654321", null); pi.setFax(fax); FullAddress addr = new FullAddress("CN", "zj", "3480", "wensanlu", "315000"); pi.setFullAddress(addr); pi.setMobileNo("13584652131"); pi.setMale(true); pi.setDepartment("b2b"); pi.setHomepageUrl("www.capcom.com"); pi.setJobTitle("qa"); pi.setName("superman"); bigPerson.setInfoProfile(pi); } @Test public void test_BigPerson() throws Exception { assertObject(bigPerson); } @Test public void test_BigPerson_WithType() throws Exception { assertObjectWithType(bigPerson, BigPerson.class); } MediaContent mediaContent; { Media media = new Media(); media.setUri("uri://中华人民共和国"); media.setTitle("title"); media.setWidth(1239); media.setHeight(1938); media.setFormat("format-xxxx"); media.setDuration(93419235); media.setSize(3477897); media.setBitrate(94523); List<String> persons = new ArrayList<String>(); persons.add("jerry"); persons.add("tom"); persons.add("lucy"); media.setPersons(persons); media.setCopyright("1999-2011"); media.setPlayer(Player.FLASH); List<Image> images = new ArrayList<Image>(); for(int i = 0; i < 10; ++i) { Image image = new Image(); image.setUri("url" + i); if(i % 2 == 0) image.setTitle("title" + i); image.setWidth(34 + i); image.setHeight(2323 + i); image.setSize((i % 2 == 0) ? Size.SMALL : Size.LARGE); images.add(image); } mediaContent = new MediaContent(media, images); } @Test public void test_MediaContent() throws Exception { assertObject(mediaContent); } @Test public void test_MediaContent_WithType() throws Exception { assertObjectWithType(mediaContent, MediaContent.class); } @Test public void test_MultiObject() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeBool(false); objectOutput.writeObject(bigPerson); objectOutput.writeByte((byte) 23); objectOutput.writeObject(mediaContent); objectOutput.writeInt(-23); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertEquals(false, deserialize.readBool()); assertEquals(bigPerson, deserialize.readObject()); assertEquals((byte) 23, deserialize.readByte()); assertEquals(mediaContent, deserialize.readObject()); assertEquals(-23, deserialize.readInt()); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } @Test public void test_MultiObject_WithType() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeBool(false); objectOutput.writeObject(bigPerson); objectOutput.writeByte((byte) 23); objectOutput.writeObject(mediaContent); objectOutput.writeInt(-23); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); assertEquals(false, deserialize.readBool()); assertEquals(bigPerson, deserialize.readObject(BigPerson.class)); assertEquals((byte) 23, deserialize.readByte()); assertEquals(mediaContent, deserialize.readObject(MediaContent.class)); assertEquals(-23, deserialize.readInt()); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } // abnormal case @Test public void test_MediaContent_badStream() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(mediaContent); objectOutput.flushBuffer(); byte[] byteArray = byteArrayOutputStream.toByteArray(); for (int i = 0; i < byteArray.length; i++) { if(i%3 == 0) { byteArray[i] = (byte)~byteArray[i]; } } ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray); try { ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); @SuppressWarnings("unused") // local variable, convenient for debug Object read = deserialize.readObject(); fail(); } catch (IOException expected) { System.out.println(expected); } } @Test public void test_MediaContent_WithType_badStream() throws Exception { ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(mediaContent); objectOutput.flushBuffer(); byte[] byteArray = byteArrayOutputStream.toByteArray(); for (int i = 0; i < byteArray.length; i++) { if(i%3 == 0) { byteArray[i] = (byte)~byteArray[i]; } } ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray); try { ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); @SuppressWarnings("unused") // local variable, convenient for debug Object read = deserialize.readObject(MediaContent.class); fail(); } catch (IOException expected) { System.out.println(expected); } } @Test(timeout=3000) public void test_LoopReference() throws Exception { Map<String, Object> map= new HashMap<String, Object>(); map.put("k1", "v1"); map.put("self", map); ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(map); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); @SuppressWarnings("unchecked") Map<String, Object> output = (Map<String, Object>) deserialize.readObject(); assertEquals("v1", output.get("k1")); assertSame(output, output.get("self")); } // ================ final field test ================ @Test public void test_URL_mutable_withType() throws Exception { URL data = URL.valueOf("dubbo://admin:hello1234@10.20.130.230:20880/context/path?version=1.0.0&application=morgan&noValue"); ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream); objectOutput.writeObject(data); objectOutput.flushBuffer(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( byteArrayOutputStream.toByteArray()); ObjectInput deserialize = serialization.deserialize(url, byteArrayInputStream); URL actual = (URL) deserialize.readObject(URL.class); assertEquals(data, actual); assertEquals(data.getParameters(), actual.getParameters()); try { deserialize.readObject(); fail(); } catch (IOException expected) { } } }