package com.twitter.chill.avro; import avro.FiscalRecord; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.twitter.chill.KryoInstantiator; import com.twitter.chill.KryoPool; import org.apache.avro.Schema; import org.apache.avro.SchemaBuilder; import org.apache.avro.generic.GenericData; import org.apache.avro.generic.GenericRecordBuilder; import org.junit.Before; import org.junit.Test; import org.objenesis.strategy.StdInstantiatorStrategy; import scala.reflect.ClassTag; import static org.junit.Assert.assertEquals; public class AvroSerializerJavaTest { private Schema schema; private GenericData.Record user; private FiscalRecord fiscalRecord; @Before public void setUp() throws Exception { schema = SchemaBuilder .record("person") .fields() .name("name").type().stringType().noDefault() .name("ID").type().intType().noDefault() .endRecord(); user = new GenericRecordBuilder(schema) .set("name", "Jeff") .set("ID", 1) .build(); fiscalRecord = FiscalRecord.newBuilder().setCalendarDate("2012-01-01").setFiscalWeek(1).setFiscalYear(2012).build(); } public <T> KryoPool getKryo(final ClassTag<T> tag, final Serializer<T> serializer){ KryoInstantiator kryoInstantiator = new KryoInstantiator() { public Kryo newKryo() { Kryo k =super.newKryo(); k.setInstantiatorStrategy(new StdInstantiatorStrategy()); k.register(tag.runtimeClass(), serializer); return k; } }; return KryoPool.withByteArrayOutputStream(1, kryoInstantiator); } @Test public void testSpecificRecordSerializer() throws Exception { ClassTag<FiscalRecord> tag = getClassTag(FiscalRecord.class); KryoPool kryo = getKryo(tag, AvroSerializer$.MODULE$.SpecificRecordSerializer(tag)); byte[] bytes = kryo.toBytesWithClass(fiscalRecord); FiscalRecord result = (FiscalRecord) kryo.fromBytes(bytes); assertEquals(fiscalRecord,result); } @Test public void SpecificRecordBinarySerializer() throws Exception { ClassTag<FiscalRecord> tag = getClassTag(FiscalRecord.class); KryoPool kryo = getKryo(tag, AvroSerializer$.MODULE$.SpecificRecordBinarySerializer(tag)); byte[] bytes = kryo.toBytesWithClass(fiscalRecord); FiscalRecord result = (FiscalRecord) kryo.fromBytes(bytes); assertEquals(fiscalRecord,result); } @Test public void testGenericRecord() throws Exception { ClassTag<GenericData.Record> tag = getClassTag(GenericData.Record.class); KryoPool kryo = getKryo(tag, AvroSerializer$.MODULE$.GenericRecordSerializer(schema,tag)); byte[] userBytes = kryo.toBytesWithClass(user); GenericData.Record userResult = (GenericData.Record) kryo.fromBytes(userBytes); assertEquals(userResult.get("name").toString(),"Jeff"); assertEquals(userResult.get("ID"),1); assertEquals(user.toString(), userResult.toString()); } private <T> ClassTag<T> getClassTag(Class<T> klass) { return scala.reflect.ClassTag$.MODULE$.apply(klass); } }