package protobuf.codec.xml; import static junit.framework.Assert.assertEquals; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import org.apache.commons.codec.binary.Base64; import org.junit.Before; import org.junit.Test; import protobuf.codec.Codec; import protobuf.codec.xml.TypesProtoBuf; import protobuf.codec.xml.XmlCodec; import protobuf.codec.xml.TypesProtoBuf.Foo; import protobuf.codec.xml.TypesProtoBuf.Lang; import protobuf.codec.xml.TypesProtoBuf.RepeatedFields; import protobuf.codec.xml.TypesProtoBuf.Types; import protobuf.codec.xml.TypesProtoBuf.Version; import com.google.protobuf.ByteString; import com.google.protobuf.ExtensionRegistry; public class XmlCodecTest { private Types types; private String typesXml; private Foo foo; private String fooXml; private String helloworld="HelloWorld"; private String helloworldInBase64=Base64.encodeBase64String(helloworld.getBytes()); @Before public void setupTypes() throws IOException,XMLStreamException{ types=Types.newBuilder() .setIdbool(true) .setIddouble(Double.MAX_VALUE) .setIdfixed32(Integer.MIN_VALUE) .setIdfixed64(Long.MIN_VALUE) .setIdfloat(Float.MAX_VALUE) .setIdint32(1) .setIdint64(5000000000000000000l) .setIdsfixed32(-56) .setIdsfixed64(-561234561435l) .setIdsint32(-100) .setIdsint64(Long.MAX_VALUE) .setIdstring("Hello World") .setIduint32(100) .setIduint64(100l) .setLang(Lang.HASKELL) .setIdbyte(ByteString.copyFromUtf8(helloworld)) .build(); XMLOutputFactory factory=XMLOutputFactory.newInstance(); StringWriter writer=new StringWriter(); XMLStreamWriter xmlwriter=factory.createXMLStreamWriter(writer); xmlwriter.writeStartDocument(); xmlwriter.writeStartElement("types"); xmlwriter.writeStartElement("idstring"); xmlwriter.writeCharacters(types.getIdstring()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("idint32"); xmlwriter.writeCharacters(""+types.getIdint32()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("iddouble"); xmlwriter.writeCharacters(""+types.getIddouble()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("idfloat"); xmlwriter.writeCharacters(""+types.getIdfloat()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("idint64"); xmlwriter.writeCharacters(""+types.getIdint64()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("iduint32"); xmlwriter.writeCharacters(""+types.getIduint32()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("iduint64"); xmlwriter.writeCharacters(""+types.getIduint64()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("idsint32"); xmlwriter.writeCharacters(""+types.getIdsint32()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("idsint64"); xmlwriter.writeCharacters(""+types.getIdsint64()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("idfixed32"); xmlwriter.writeCharacters(""+types.getIdfixed32()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("idfixed64"); xmlwriter.writeCharacters(""+types.getIdfixed64()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("idsfixed32"); xmlwriter.writeCharacters(""+types.getIdsfixed32()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("idsfixed64"); xmlwriter.writeCharacters(""+types.getIdsfixed64()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("idbool"); xmlwriter.writeCharacters(""+types.getIdbool()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("lang"); xmlwriter.writeCharacters(Lang.HASKELL.name()); xmlwriter.writeEndElement(); xmlwriter.writeStartElement("idbyte"); xmlwriter.writeCharacters(helloworldInBase64); xmlwriter.writeEndElement(); xmlwriter.writeEndElement(); xmlwriter.writeEndDocument(); xmlwriter.close(); typesXml=writer.toString(); foo=Foo.newBuilder() .setId(1) .setName("Hello World") .setExtension(TypesProtoBuf.langs, new ArrayList<Lang>(){{ add(Lang.HASKELL); add(Lang.JAVA); }}) .setExtension(TypesProtoBuf.alias, "Hi There") .build(); StringWriter writer1=new StringWriter(); XMLStreamWriter xmlwriter1=factory.createXMLStreamWriter(writer1); xmlwriter1.writeStartDocument(); xmlwriter1.writeStartElement("foo"); xmlwriter1.writeStartElement("id"); xmlwriter1.writeCharacters(""+foo.getId()); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("name"); xmlwriter1.writeCharacters(""+foo.getName()); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement(Codec.DEFAULT_EXTENSION_NAME_PREFIX+"-"+"alias"); xmlwriter1.writeCharacters("Hi There"); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement(Codec.DEFAULT_EXTENSION_NAME_PREFIX+"-"+"langs"); xmlwriter1.writeCharacters(""+Lang.HASKELL.name()); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement(Codec.DEFAULT_EXTENSION_NAME_PREFIX+"-"+"langs"); xmlwriter1.writeCharacters(""+Lang.JAVA.name()); xmlwriter1.writeEndElement(); xmlwriter1.writeEndElement(); xmlwriter1.writeEndDocument(); xmlwriter1.close(); fooXml=writer1.toString(); } @Test public void testEnsureTypes() throws Exception{ Codec xmlcodec=new XmlCodec(); StringWriter writer=new StringWriter(); xmlcodec.fromMessage(types, writer); writer.close(); assertEquals(typesXml, writer.toString()); assertEquals(types, xmlcodec.toMessage(Types.class, new StringReader(writer.toString()))); } @Test public void validateExtensions() throws Exception{ Codec xmlcodec=new XmlCodec(); StringWriter writer=new StringWriter(); xmlcodec.fromMessage(foo, writer); writer.close(); assertEquals(writer.toString(), fooXml); ExtensionRegistry reg=ExtensionRegistry.newInstance(); reg.add(TypesProtoBuf.alias); reg.add(TypesProtoBuf.langs); assertEquals(foo, xmlcodec.toMessage(Foo.class, new StringReader(writer.toString()),reg)); } @Test public void ensureRepeatedFields() throws Exception{ RepeatedFields repFields=RepeatedFields.newBuilder() .addId(1) .addId(2) .addLangs(Lang.HASKELL) .addLangs(Lang.JAVA) .addVersions(Version.newBuilder() .setName("release") .setVernum(1) .build()) .addVersions(Version.newBuilder() .setName("nightly") .setVernum(2) .build()) .addNames("funny") .addNames("bones") .setFieldId(5) .build(); StringWriter wr=new StringWriter(); Codec xmlcodec=new XmlCodec(); xmlcodec.fromMessage(repFields, wr); StringWriter wr1=new StringWriter(); XMLOutputFactory factory=XMLOutputFactory.newInstance(); XMLStreamWriter xmlwriter1=factory.createXMLStreamWriter(wr1); xmlwriter1.writeStartDocument(); xmlwriter1.writeStartElement("repeatedfields"); xmlwriter1.writeStartElement("fieldId"); xmlwriter1.writeCharacters(""+repFields.getFieldId()); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("id"); xmlwriter1.writeCharacters("1"); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("id"); xmlwriter1.writeCharacters("2"); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("names"); xmlwriter1.writeCharacters("funny"); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("names"); xmlwriter1.writeCharacters("bones"); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("versions"); xmlwriter1.writeStartElement("name"); xmlwriter1.writeCharacters("release"); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("vernum"); xmlwriter1.writeCharacters("1"); xmlwriter1.writeEndElement(); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("versions"); xmlwriter1.writeStartElement("name"); xmlwriter1.writeCharacters("nightly"); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("vernum"); xmlwriter1.writeCharacters("2"); xmlwriter1.writeEndElement(); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("langs"); xmlwriter1.writeCharacters("HASKELL"); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("langs"); xmlwriter1.writeCharacters("JAVA"); xmlwriter1.writeEndElement(); xmlwriter1.writeEndElement(); xmlwriter1.writeEndDocument(); xmlwriter1.close(); assertEquals(wr1.toString(), wr.toString()); RepeatedFields fromStream=(RepeatedFields) xmlcodec.toMessage(RepeatedFields.class, new StringReader(wr1.toString())); assertEquals(repFields, fromStream); } @Test public void testRepeatedExtensions() throws Exception{ Foo foo1=Foo.newBuilder() .setId(1) .setName("Hello World") .setExtension(TypesProtoBuf.langs, new ArrayList<Lang>(){{ add(Lang.HASKELL); add(Lang.JAVA); }}) .addExtension(TypesProtoBuf.version,Version.newBuilder() .setName("release") .setVernum(1) .build()) .addExtension(TypesProtoBuf.version,Version.newBuilder() .setName("nightly") .setVernum(2) .build()) .setExtension(TypesProtoBuf.version1,Version.newBuilder() .setName("snapshot") .setVernum(10) .build()) .setExtension(TypesProtoBuf.alias, "Hi There") .build(); StringWriter writer1=new StringWriter(); XMLOutputFactory factory=XMLOutputFactory.newInstance(); XMLStreamWriter xmlwriter1=factory.createXMLStreamWriter(writer1); xmlwriter1.writeStartDocument(); xmlwriter1.writeStartElement("foo"); xmlwriter1.writeStartElement("id"); xmlwriter1.writeCharacters(""+foo.getId()); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("name"); xmlwriter1.writeCharacters(""+foo.getName()); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement(Codec.DEFAULT_EXTENSION_NAME_PREFIX+"-"+"alias"); xmlwriter1.writeCharacters("Hi There"); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement(Codec.DEFAULT_EXTENSION_NAME_PREFIX+"-"+"langs"); xmlwriter1.writeCharacters(""+Lang.HASKELL.name()); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement(Codec.DEFAULT_EXTENSION_NAME_PREFIX+"-"+"langs"); xmlwriter1.writeCharacters(""+Lang.JAVA.name()); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement(Codec.DEFAULT_EXTENSION_NAME_PREFIX+"-"+"version"); xmlwriter1.writeStartElement("name"); xmlwriter1.writeCharacters("release"); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("vernum"); xmlwriter1.writeCharacters("1"); xmlwriter1.writeEndElement(); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement(Codec.DEFAULT_EXTENSION_NAME_PREFIX+"-"+"version"); xmlwriter1.writeStartElement("name"); xmlwriter1.writeCharacters("nightly"); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("vernum"); xmlwriter1.writeCharacters("2"); xmlwriter1.writeEndElement(); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement(Codec.DEFAULT_EXTENSION_NAME_PREFIX+"-"+"version1"); xmlwriter1.writeStartElement("name"); xmlwriter1.writeCharacters("snapshot"); xmlwriter1.writeEndElement(); xmlwriter1.writeStartElement("vernum"); xmlwriter1.writeCharacters("10"); xmlwriter1.writeEndElement(); xmlwriter1.writeEndElement(); xmlwriter1.writeEndElement(); xmlwriter1.writeEndDocument(); xmlwriter1.close(); StringWriter sw=new StringWriter(); Codec codec=new XmlCodec(); codec.fromMessage(foo1, sw); assertEquals(writer1.toString(), sw.toString()); Foo foo2=Foo.newBuilder() .setId(1) .setName("Hello World").build(); Foo foo3=(Foo) codec.toMessage(Foo.class, new StringReader(sw.toString())); assertEquals(foo2, foo3); ExtensionRegistry reg=ExtensionRegistry.newInstance(); reg.add(TypesProtoBuf.alias); reg.add(TypesProtoBuf.langs); reg.add(TypesProtoBuf.version); reg.add(TypesProtoBuf.version1); foo3=(Foo) codec.toMessage(Foo.class, new StringReader(sw.toString()),reg); assertEquals(foo1, foo3); } }