package de.jpaw.bonaparte.hazelcast.test;
import java.io.IOException;
import org.testng.annotations.Test;
import com.hazelcast.config.SerializationConfig;
import com.hazelcast.config.SerializerConfig;
import com.hazelcast.nio.ObjectDataInput;
import com.hazelcast.nio.ObjectDataOutput;
import com.hazelcast.nio.serialization.Data;
import com.hazelcast.nio.serialization.DataSerializableFactory;
import com.hazelcast.nio.serialization.DefaultSerializationServiceBuilder;
import com.hazelcast.nio.serialization.IdentifiedDataSerializable;
import com.hazelcast.nio.serialization.SerializationService;
import com.hazelcast.nio.serialization.SerializationServiceBuilder;
import com.hazelcast.nio.serialization.Serializer;
import de.jpaw.bonaparte.core.BonaPortable;
import de.jpaw.bonaparte.core.BonaPortableFactoryById;
import de.jpaw.bonaparte.hazelcast.BonaparteByteArraySerializer;
import de.jpaw.bonaparte.hazelcast.BonaparteStreamSerializer;
import de.jpaw.bonaparte.pojos.hazeltest.DSTest;
import de.jpaw.bonaparte.pojos.hazeltest.IDSTest;
import de.jpaw.bonaparte.pojos.hazeltest.PojoTest;
@Test
public class SerializationTest {
private static void doTest(Object obj, String msg, DataSerializableFactory f, Serializer s) throws IOException {
System.out.println(msg);
// Config cfg = new Config();
// HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
// Map<Integer, DSTest> testMap = instance.getMap("dstest");
// testMap.put(1, obj);
// now obtain the raw data behind it
SerializationServiceBuilder b = new DefaultSerializationServiceBuilder().setUseNativeByteOrder(true);
if (s != null) {
b.setConfig(new SerializationConfig().addSerializerConfig(new SerializerConfig()
.setTypeClass(BonaPortable.class)
.setImplementation(s)));
}
final SerializationService ss = (f == null ? b : b.addDataSerializableFactory(12, f)).build();
//final Data data1 = ss.toData(obj);
final Data data3 = ss.toData(obj);
final ObjectDataOutput out2 = ss.createObjectDataOutput(1024);
final ObjectDataOutput out3 = ss.createObjectDataOutput(1024);
out2.writeObject(obj);
out3.writeData(data3);
//byte [] bytes1 = data1.getData(); // shortest => existed with 3.4.x, no longer in 3.5.x
byte [] bytes2 = out2.toByteArray(); // 5 bytes more => this one is the recommended one to use
byte [] bytes3 = out3.toByteArray(); // 17 bytes more
System.out.println("Size 1 is " + 0 /* bytes1.length */ + ", size 2 is " + bytes2.length + ", size 3 is " + bytes3.length);
// System.out.println("buff 1 is\n" + ByteUtil.dump(bytes1, 0));
// System.out.println("buff 2 is\n" + ByteUtil.dump(bytes2, 0));
// System.out.println("buff 3 is\n" + ByteUtil.dump(bytes3, 0));
// parse again
final ObjectDataInput in2 = ss.createObjectDataInput(bytes2);
final ObjectDataInput in3 = ss.createObjectDataInput(bytes3);
final Object rd2 = in2.readObject();
final Data rd3 = in3.readData();
assert(obj.equals(rd2));
assert(data3.equals(rd3));
}
// simple String test
public void testUTF() throws Exception {
doTest("Hello, world!", "Test UTF", null, null);
}
// test data serializable
public void testDataSerializable() throws Exception {
DSTest tmp = new DSTest();
tmp.hello = "Hello, world";
tmp.num = 18;
tmp.short1 = "0";
tmp.short2 = "A";
tmp.hello2 = "alallalallalong... alallalallalong... ding dong!";
doTest(tmp, "Test DS", null, null);
}
// test identified data serializable
public void testIdentifiedDataSerializable() throws Exception {
IDSTest tmp = new IDSTest();
tmp.hello = "Hello, world";
tmp.num = 18;
tmp.short1 = "0";
tmp.short2 = "A";
tmp.hello2 = "alallalallalong... alallalallalong... ding dong!";
doTest(tmp, "Test IDS", new DataSerializableFactory() {
@Override
public IdentifiedDataSerializable create(int id) {
return (id == 17) ? new IDSTest() : null;
}
}, null);
}
private static void runPojoSerializer(String what, Serializer s) throws Exception {
BonaPortableFactoryById.registerClass(PojoTest.BClass.INSTANCE);
PojoTest tmp = new PojoTest();
tmp.hello = "Hello, world";
tmp.num = 18;
tmp.short1 = "0";
tmp.short2 = "A";
tmp.hello2 = "alallalallalong... alallalallalong... ding dong!";
doTest(tmp, what, null, s);
}
public void testByteArraySerializerCid() throws Exception {
runPojoSerializer("Test Pojo byte array CID", new BonaparteByteArraySerializer(true));
}
public void testByteArraySerializerPqon() throws Exception {
runPojoSerializer("Test Pojo byte array PQON", new BonaparteByteArraySerializer(false));
}
public void testStreamSerializerCid() throws Exception {
runPojoSerializer("Test Pojo stream CID", new BonaparteStreamSerializer(true));
}
public void testStreamSerializerPqon() throws Exception {
runPojoSerializer("Test Pojo stream PQON", new BonaparteStreamSerializer(false));
}
}