package voldemort.serialization.avro.versioned;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericData.Record;
import org.apache.avro.util.Utf8;
import org.junit.Test;
/**
* A test that the avro serialization remains compatible with older serialized
* data
*
*
*/
public class AvroBackwardsCompatibilityTest {
private static byte[] writeVersion0(Schema s0) {
GenericData.Record record = new GenericData.Record(s0);
record.put("original", new Utf8("Abhinay"));
AvroVersionedGenericSerializer serializer = new AvroVersionedGenericSerializer(s0.toString());
return serializer.toBytes(record);
}
private static Object readVersion0(Map<Integer, String> versions, byte[] versionZeroBytes) {
AvroVersionedGenericSerializer serializer = new AvroVersionedGenericSerializer(versions);
return serializer.toObject(versionZeroBytes);
}
private static byte[] writeVersion0with1Present(Map<Integer, String> versions, Schema s0) {
GenericData.Record record = new GenericData.Record(s0);
record.put("original", new Utf8("Abhinay"));
AvroVersionedGenericSerializer serializer = new AvroVersionedGenericSerializer(versions);
return serializer.toBytes(record);
}
/*
* This tests if a client tries to deserialize an object created using an
* old schema is successful or not
*/
@Test
public void testAvroSchemaEvolution() throws IOException {
String versionZero = "{\"type\": \"record\", \"name\": \"myrec\",\"fields\": [{ \"name\": \"original\", \"type\": \"string\" }]}";
String versionOne = "{\"type\": \"record\", \"name\": \"myrec\",\"fields\": [{ \"name\": \"original\", \"type\": \"string\" } ,"
+ "{ \"name\": \"new-field\", \"type\": \"string\", \"default\":\"\" }]}";
Schema s0 = Schema.parse(versionZero);
Schema s1 = Schema.parse(versionOne);
Map<Integer, String> versions = new HashMap<Integer, String>();
versions.put(0, versionZero);
versions.put(1, versionOne);
byte[] versionZeroBytes = writeVersion0(s0);
GenericData.Record record = (Record) readVersion0(versions, versionZeroBytes);
}
/*
* This tests if a client tries to serialize an object created using an old
* schema is successful or not
*/
@Test
public void testAvroSchemaEvolutionWrite() throws IOException {
String versionZero = "{\"type\": \"record\", \"name\": \"myrec\",\"fields\": [{ \"name\": \"original\", \"type\": \"string\" }]}";
String versionOne = "{\"type\": \"record\", \"name\": \"myrec\",\"fields\": [{ \"name\": \"original\", \"type\": \"string\" } ,"
+ "{ \"name\": \"new-field\", \"type\": \"string\", \"default\":\"\" }]}";
Schema s0 = Schema.parse(versionZero);
Schema s1 = Schema.parse(versionOne);
Map<Integer, String> versions = new HashMap<Integer, String>();
versions.put(0, versionZero);
versions.put(1, versionOne);
byte[] versionZeroBytes = writeVersion0with1Present(versions, s0);
}
}