package de.jpaw.bonaparte.core.tests; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.Arrays; import org.testng.annotations.Test; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Output; import de.jpaw.bonaparte.core.BonaPortable; import de.jpaw.bonaparte.core.ByteArrayComposer; import de.jpaw.bonaparte.core.ByteArrayParser; import de.jpaw.bonaparte.core.CompactByteArrayComposer; import de.jpaw.bonaparte.core.CompactByteArrayParser; import de.jpaw.bonaparte.core.CompactComposer; import de.jpaw.bonaparte.core.CompactParser; import de.jpaw.bonaparte.core.MessageComposer; import de.jpaw.bonaparte.core.MessageParser; import de.jpaw.bonaparte.core.MessageParserException; import de.jpaw.bonaparte.core.StringBuilderComposer; import de.jpaw.bonaparte.core.StringBuilderParser; import de.jpaw.bonaparte.pojos.meta.ClassDefinition; import de.jpaw.util.ByteArray; public class SerializationTest { static private boolean doDump = false; private void dumpToFile(String filename, byte [] data) throws Exception { OutputStream stream = new FileOutputStream(filename); stream.write(data); stream.close(); } static boolean matchStrings(String a, String b) { if (a == null) return b == null; return a.equals(b); } static private boolean compareTest1(ClassDefinition a, ClassDefinition b) { return a.getIsAbstract() == b.getIsAbstract() && a.getIsFinal() == b.getIsFinal() && matchStrings(a.getName(), b.getName()) && matchStrings(a.getRevision(), b.getRevision()) && a.getNumberOfFields() == b.getNumberOfFields(); } @Test public void testObj1StringBuilder() throws Exception { ClassDefinition obj1 = ClassDefinition.class$MetaData(); System.out.println("Test starting: composer Kryo"); Kryo kryo = new Kryo(); byte [] buffer = new byte[4000]; Output output = new Output(buffer); kryo.writeObject(output, obj1); System.out.println("Length with Kryo is " + output.position()); output.close(); System.out.println("Test starting: composer Compact"); ByteArrayOutputStream baos = new ByteArrayOutputStream(4000); DataOutputStream dataOut = new DataOutputStream(baos); CompactComposer cc = new CompactComposer(dataOut, false); cc.reset(); cc.writeRecord(obj1); dataOut.flush(); byte [] ccResult = baos.toByteArray(); System.out.println("Length with CompactComposer is " + dataOut.size()); assert(dataOut.size() == ccResult.length); System.out.println("Test starting: composer ByteArrayCompact"); CompactByteArrayComposer cbac = new CompactByteArrayComposer(4000, false); cbac.writeRecord(obj1); byte [] cbacResult = cbac.getBuilder().getBytes(); System.out.println("Length with ByteArrayCompactComposer is " + cbacResult.length); assert(cbacResult.length == dataOut.size()); assert Arrays.equals(ccResult, cbacResult) : "produced byte data should be identical"; System.out.println("Test starting: composer StringBuilder"); StringBuilderComposer sbc = new StringBuilderComposer(new StringBuilder()); sbc.reset(); sbc.writeRecord(obj1); byte [] sbcResult = sbc.getBytes(); System.out.println("Test starting: composer ByteArray"); MessageComposer<RuntimeException> bac = new ByteArrayComposer(); bac.writeRecord(obj1); byte [] bacResult = sbc.getBytes(); System.out.println("Length with SBC is " + sbcResult.length + ", length with BAC is " + bacResult.length); assert sbcResult.length == bacResult.length : "produced byte data should have the same length"; assert Arrays.equals(sbcResult, bacResult) : "produced byte data should be identical"; if (doDump) dumpToFile("/tmp/Test1-dump.bin", sbcResult); // deserialize again StringBuilder work = new StringBuilder(new String (bacResult, ByteArray.CHARSET_UTF8)); MessageParser<MessageParserException> w = new StringBuilderParser(work, 0, -1); BonaPortable obj2 = w.readRecord(); assert obj2 instanceof ClassDefinition : "returned obj is of wrong type (StringBuilderParser)"; assert compareTest1(obj1, (ClassDefinition)obj2) : "returned obj is not equal to original one (StringBuilderParser)"; assert obj1.equals(obj2) : "returned obj is not equal to original one (StringBuilderParser) (own test)"; // alternate deserializer MessageParser<MessageParserException> w2 = new ByteArrayParser(sbcResult, 0, -1); BonaPortable obj3 = w2.readRecord(); assert obj3 instanceof ClassDefinition : "returned obj is of wrong type (ByteArrayParser)"; assert compareTest1(obj1, (ClassDefinition)obj3) : "returned obj is not equal to original one (ByteArrayParser)"; assert obj1.equals(obj3) : "returned obj is not equal to original one (ByteArrayParser) (own test)"; // compact byte array parser CompactByteArrayParser bap = new CompactByteArrayParser(ccResult, 0, -1); BonaPortable resultBap = bap.readRecord(); assert resultBap instanceof ClassDefinition : "returned obj is of wrong type (CompactByteArrayParser)"; assert compareTest1(obj1, (ClassDefinition)resultBap) : "returned obj is not equal to original one (CompactByteArrayParser)"; assert obj1.equals(resultBap) : "returned obj is not equal to original one (CompactByteArrayParser) (own test)"; // compact parser ByteArrayInputStream bais = new ByteArrayInputStream(ccResult); DataInputStream dis = new DataInputStream(bais); CompactParser cp = new CompactParser(dis); BonaPortable resultCp = cp.readRecord(); assert resultCp instanceof ClassDefinition : "returned obj is of wrong type (CompactParser)"; assert compareTest1(obj1, (ClassDefinition)resultCp) : "returned obj is not equal to original one (CompactParser)"; assert obj1.equals(resultCp) : "returned obj is not equal to original one (CompactParser) (own test)"; } }