package voldemort.serialization.json;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.apache.commons.io.IOUtils;
import voldemort.utils.Utils;
import com.google.common.collect.ImmutableList;
/**
* A test that the json serialization remains compatible with older serialized
* data
*
*
*/
public class JsonBackwardsCompatibilityTest extends TestCase {
private static JsonTypeDefinition def = JsonTypeDefinition.fromJson("[{"
+ "'int8':'int8',"
+ "'int16':'int16',"
+ "'int32':'int32', "
+ "'int64':'int64',"
+ "'float32':'float32',"
+ "'float64':'float64',"
+ "'string':'string',"
+ "'list_of_int':['int32'],"
+ "'d':'date'," + "}]");
private static List<Map<String, Object>> expected = new ArrayList<Map<String, Object>>();
static {
for(int i = -50; i < 50; i++) {
String string = Integer.toString(i);
expected.add(makeMapData((byte) i,
(short) i,
i,
(long) i,
(float) i,
(double) i,
string,
ImmutableList.of(i),
new Date(i)));
}
expected.add(makeMapData(null, null, null, null, null, null, null, null, null));
}
public void testBinaryCompatibility() throws Exception {
String compatFileName = "/voldemort/serialization/json/compatibility.dat";
InputStream s = JsonBackwardsCompatibilityTest.class.getResourceAsStream(compatFileName);
assertNotNull("Did not find file " + compatFileName + " on the class path.", s);
byte[] bytes = IOUtils.toByteArray(s);
Object found = new JsonTypeSerializer(def, true).toObject(bytes);
assertEquals(expected, found);
}
private static Map<String, Object> makeMapData(Byte b,
Short s,
Integer i,
Long l,
Float f,
Double d,
String string,
List<Integer> loi,
Date date) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("int8", b);
m.put("int16", s);
m.put("int32", i);
m.put("int64", l);
m.put("float32", f);
m.put("float64", d);
m.put("string", string);
m.put("list_of_int", loi);
m.put("d", date);
return m;
}
/*
* This main method generates data that is stored and used for compatibility
* testing. Do not regenerate the data after a code change as that would
* defeat the purpose of a test like this.
*/
public static void main(String[] args) throws Exception {
if(args.length != 1)
Utils.croak("USAGE: java TestCompatibility outputfilename");
FileOutputStream output = new FileOutputStream(args[0]);
output.write(new JsonTypeSerializer(def, true).toBytes(expected));
output.close();
}
}