package org.vertexium.serializer.kryo;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.vertexium.GraphConfiguration;
import org.vertexium.VertexiumSerializer;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.assertEquals;
@RunWith(Parameterized.class)
public class KryoVertexiumSerializerTest {
private final boolean compress;
private int iterations;
private boolean shouldAssertTiming;
private GraphConfiguration graphConfiguration;
@Parameterized.Parameters(name = "compress={0}")
public static Iterable<Object[]> initialVisibilitySources() {
return Arrays.asList(new Object[][]{
{true}, {false}
});
}
public KryoVertexiumSerializerTest(boolean compress) {
this.compress = compress;
}
@Before
public void before() {
System.gc();
Map<String, Object> config = new HashMap<>();
config.put(QuickKryoVertexiumSerializer.CONFIG_COMPRESS, compress);
shouldAssertTiming = !compress;
iterations = compress ? 100 : 100000;
graphConfiguration = new GraphConfiguration(config);
}
@Test
public void testObjectToValue() {
byte[] valBytes = new KryoVertexiumSerializer().objectToBytes(new Date());
assertEquals(10, valBytes.length);
}
@Test
public void testLongString() {
System.out.println("testLongString");
timeItLongString(new KryoVertexiumSerializer());
long quickKryoTime = timeItLongString(new QuickKryoVertexiumSerializer(graphConfiguration));
long kryoTime = timeItLongString(new KryoVertexiumSerializer());
assertTiming(quickKryoTime, kryoTime);
}
private long timeItLongString(VertexiumSerializer serializer) {
return testItString(
serializer,
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed consequat libero non nunc interdum " +
"rutrum. Donec ac scelerisque libero, ut elementum ipsum. Donec placerat interdum nunc. Sed " +
"et placerat mi. Morbi tristique, diam a cursus egestas, quam nisi sollicitudin justo, at " +
"vehicula erat felis in risus. Nullam aliquet dictum eros eu cursus. Mauris id tellus cursus," +
" malesuada purus sed, maximus mauris. Suspendisse non consectetur purus. Etiam faucibus ligula " +
"eget ipsum porta finibus. Vestibulum vitae ornare ligula, eget molestie ligula. Praesent " +
"consequat pulvinar sem vel tincidunt. Integer nisl est, gravida id luctus vel, hendrerit " +
"non felis. Quisque sed risus consequat, tempor tellus sit amet, bibendum lorem."
);
}
@Test
public void testString() {
System.out.println("testString");
timeItString(new KryoVertexiumSerializer());
long quickKryoTime = timeItString(new QuickKryoVertexiumSerializer(graphConfiguration));
long kryoTime = timeItString(new KryoVertexiumSerializer());
assertTiming(quickKryoTime, kryoTime);
}
private long timeItString(VertexiumSerializer serializer) {
String string = "yo mamma";
return testItString(serializer, string);
}
private long testItString(VertexiumSerializer serializer, String string) {
long startTime = System.currentTimeMillis();
long bytes = 0;
for (int i = 0; i < iterations; i++) {
byte[] v = serializer.objectToBytes(string);
assertEquals(string, serializer.bytesToObject(v));
bytes += v.length;
}
long endTime = System.currentTimeMillis();
System.out.println(serializer.getClass().getName() + " time: " + (endTime - startTime) + "ms (size: " + new DecimalFormat("#,##0").format(bytes) + ")");
return endTime - startTime;
}
@Test
public void testBigDecimal() {
System.out.println("testBigDecimal");
timeItBigDecimal(new KryoVertexiumSerializer());
long quickKryoTime = timeItBigDecimal(new QuickKryoVertexiumSerializer(graphConfiguration));
long kryoTime = timeItBigDecimal(new KryoVertexiumSerializer());
assertTiming(quickKryoTime, kryoTime);
}
private long timeItBigDecimal(VertexiumSerializer serializer) {
long startTime = System.currentTimeMillis();
long bytes = 0;
for (int i = 0; i < iterations; i++) {
byte[] v = serializer.objectToBytes(new BigDecimal("42.987654321"));
assertEquals(new BigDecimal("42.987654321"), serializer.bytesToObject(v));
bytes += v.length;
}
long endTime = System.currentTimeMillis();
System.out.println(serializer.getClass().getName() + " time: " + (endTime - startTime) + "ms (size: " + new DecimalFormat("#,##0").format(bytes) + ")");
return endTime - startTime;
}
@Test
public void testDate() {
System.out.println("testDate");
timeItDate(new KryoVertexiumSerializer());
long quickKryoTime = timeItDate(new QuickKryoVertexiumSerializer(graphConfiguration));
long kryoTime = timeItDate(new KryoVertexiumSerializer());
assertTiming(quickKryoTime, kryoTime);
}
private long timeItDate(VertexiumSerializer serializer) {
long startTime = System.currentTimeMillis();
long bytes = 0;
for (int i = 0; i < iterations; i++) {
Date date = new Date();
byte[] v = serializer.objectToBytes(date);
assertEquals(date, serializer.bytesToObject(v));
bytes += v.length;
}
long endTime = System.currentTimeMillis();
System.out.println(serializer.getClass().getName() + " time: " + (endTime - startTime) + "ms (size: " + new DecimalFormat("#,##0").format(bytes) + ")");
return endTime - startTime;
}
@Test
public void testLong() {
System.out.println("testLong");
timeItLong(new KryoVertexiumSerializer());
long quickKryoTime = timeItLong(new QuickKryoVertexiumSerializer(graphConfiguration));
long kryoTime = timeItLong(new KryoVertexiumSerializer());
assertTiming(quickKryoTime, kryoTime);
}
private long timeItLong(VertexiumSerializer serializer) {
long startTime = System.currentTimeMillis();
long bytes = 0;
for (int i = 0; i < iterations; i++) {
Long l = 123456L;
byte[] v = serializer.objectToBytes(l);
assertEquals(l, serializer.bytesToObject(v));
bytes += v.length;
}
long endTime = System.currentTimeMillis();
System.out.println(serializer.getClass().getName() + " time: " + (endTime - startTime) + "ms (size: " + new DecimalFormat("#,##0").format(bytes) + ")");
return endTime - startTime;
}
@Test
public void testDouble() {
System.out.println("testDouble");
timeItDouble(new KryoVertexiumSerializer());
long quickKryoTime = timeItDouble(new QuickKryoVertexiumSerializer(graphConfiguration));
long kryoTime = timeItDouble(new KryoVertexiumSerializer());
assertTiming(quickKryoTime, kryoTime);
}
private long timeItDouble(VertexiumSerializer serializer) {
long startTime = System.currentTimeMillis();
long bytes = 0;
for (int i = 0; i < iterations; i++) {
double d = 3.1415;
byte[] v = serializer.objectToBytes(d);
assertEquals(d, serializer.bytesToObject(v), 0.001);
bytes += v.length;
}
long endTime = System.currentTimeMillis();
System.out.println(serializer.getClass().getName() + " time: " + (endTime - startTime) + "ms (size: " + new DecimalFormat("#,##0").format(bytes) + ")");
return endTime - startTime;
}
@Test
public void testTestClass() {
TestClass testClass = new TestClass("value1", 42);
KryoVertexiumSerializer serializer = new KryoVertexiumSerializer();
byte[] v = serializer.objectToBytes(testClass);
assertEquals(testClass, serializer.bytesToObject(v));
}
@Test
public void testTestClassQuick() {
TestClass testClass = new TestClass("value1", 42);
QuickKryoVertexiumSerializer serializer = new QuickKryoVertexiumSerializer(graphConfiguration);
byte[] v = serializer.objectToBytes(testClass);
assertEquals(testClass, serializer.bytesToObject(v));
}
private void assertTiming(long quickKryoTime, long kryoTime) {
if (shouldAssertTiming) {
// we can't fail when the timing is off because sometimes it's the JVMs fault doing garbage collection or something
if (quickKryoTime > kryoTime) {
System.err.println("WARNING: quick (" + quickKryoTime + "ms) was slower than Kryo (" + kryoTime + "ms)");
}
}
}
public static class TestClass {
private String field1;
private long field2;
public TestClass(String field1, int field2) {
this.field1 = field1;
this.field2 = field2;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TestClass testClass = (TestClass) o;
if (field2 != testClass.field2) return false;
if (field1 != null ? !field1.equals(testClass.field1) : testClass.field1 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = field1 != null ? field1.hashCode() : 0;
result = 31 * result + (int) (field2 ^ (field2 >>> 32));
return result;
}
}
}