package org.mapdb.elsa;
import org.fest.reflect.core.Reflection;
import org.junit.Test;
import org.mapdb.*;
import java.io.File;
import java.io.IOException;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
/**Q
* Serialization unit tests, moved from Elsa because it had dependency on mapdb
*/
public class ElsaIssues {
@Test
public void testIssue177() throws UnknownHostException {
DB db = DBMaker.memoryDB().make();
InetAddress value = InetAddress.getByName("127.0.0.1");
long recid = db.getStore().put(value, db.getDefaultSerializer());
Object value2 = db.getStore().get(recid,db.getDefaultSerializer());
assertEquals(value,value2);
}
@Test public void test2() throws IOException {
File index = TT.tempFile();
DB db = DBMaker.fileDB(index).make();
Serialization2Bean processView = new Serialization2Bean();
Map<Object, Object> map = db.hashMap("test2").create();
map.put("abc", processView);
db.commit();
Serialization2Bean retProcessView = (Serialization2Bean)map.get("abc");
assertEquals(processView, retProcessView);
db.close();
}
@Test public void test2_engine() throws IOException {
File index = TT.tempFile();
DB db = DBMaker.fileDB(index).make();
Serialization2Bean processView = new Serialization2Bean();
long recid = db.getStore().put(processView, (Serializer<Object>) db.getDefaultSerializer());
db.commit();
Serialization2Bean retProcessView = (Serialization2Bean) db.getStore().get(recid, db.getDefaultSerializer());
assertEquals(processView, retProcessView);
db.close();
}
@Test public void test3() throws IOException {
File index = TT.tempFile();
Serialized2DerivedBean att = new Serialized2DerivedBean();
DB db = DBMaker.fileDB(index).make();
Map<Object, Object> map = db.hashMap("test").create();
map.put("att", att);
db.commit();
db.close();
db = DBMaker.fileDB(index).make();
map = db.hashMap("test").open();
Serialized2DerivedBean retAtt = (Serialized2DerivedBean) map.get("att");
assertEquals(att, retAtt);
}
static class AAA implements Serializable {
private static final long serialVersionUID = 632633199013551846L;
String test = "aa";
}
@Test public void testReopenWithDefrag(){
File f = TT.tempFile();
DB db = DBMaker.fileDB(f)
.make();
Map<Integer,AAA> map = db.treeMap("test", Integer.class, AAA.class).createOrOpen();
map.put(1,new AAA());
db.compact();
System.out.println(db.getStore().get(CC.RECID_CLASS_INFOS, Serializer.RECID_ARRAY));
db.close();
db = DBMaker.fileDB(f)
.make();
map = db.treeMap("test", Integer.class, AAA.class).open();
assertNotNull(map.get(1));
assertEquals(map.get(1).test, "aa");
db.close();
}
@Test public void testPersistedSimple() throws Exception {
File f = TT.tempFile();
DB r1 = DBMaker.fileDB(f).make();
long recid = r1.getStore().put("AA",r1.getDefaultSerializer());
r1.commit();
r1.close();
r1 = DBMaker.fileDB(f).make();
String a2 = (String) r1.getStore().get(recid, r1.getDefaultSerializer());
r1.close();
assertEquals("AA", a2);
}
@Test public void testPersisted() throws Exception {
Bean1 b1 = new Bean1("abc", "dcd");
File f = TT.tempFile();
DB r1 = DBMaker.fileDB(f).make();
long recid = r1.getStore().put(b1, r1.getDefaultSerializer());
r1.commit();
r1.close();
r1 = DBMaker.fileDB(f).make();
Bean1 b2 = (Bean1) r1.getStore().get(recid,r1.getDefaultSerializer());
r1.close();
assertEquals(b1, b2);
}
@Test public void test_write_object_advanced_serializationm(){
Object[] o = new Object[]{
new GregorianCalendar(1,1,1),
new Bean1("aa","bb")
};
for(Object oo:o){
DB db = DBMaker.memoryDB().make();
long recid = db.getStore().put(oo, db.getDefaultSerializer());
assertEquals(oo, db.getStore().get(recid, db.getDefaultSerializer()));
}
}
public static class test_pojo_reload_TestClass implements Serializable
{
private String name;
public test_pojo_reload_TestClass(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
test_pojo_reload_TestClass that = (test_pojo_reload_TestClass) o;
if (name != null ? !name.equals(that.name) : that.name != null) return false;
return true;
}
@Override
public int hashCode() {
return name != null ? name.hashCode() : 0;
}
}
@Test public void test_pojo_reload() throws IOException {
File f = TT.tempFile();
DB db = DBMaker.fileDB(f).make();
Set set = db.hashSet("testSerializerPojo").create();
set.add(new test_pojo_reload_TestClass("test"));
db.commit();
// System.out.println(((ElsaSerializerPojo)db.defaultSerializer).registered);
int prevsize = loadClassInfos(db).length;
db.close();
db = DBMaker.fileDB(f).fileDeleteAfterClose().make();
set = db.hashSet("testSerializerPojo").open();
set.add(new test_pojo_reload_TestClass("test2"));
db.commit();
int newsize = loadClassInfos(db).length;
// System.out.println(((ElsaSerializerPojo)db.defaultSerializer).registered);
db.close();
assertEquals(prevsize, newsize);
}
Set<Class> unknownClasses(DB db){
return Reflection.field("unknownClasses").ofType(Set.class).in(db).get();
}
ElsaSerializerPojo.ClassInfo[] loadClassInfos(DB db){
return Reflection.method("loadClassInfos").withReturnType(ElsaSerializerPojo.ClassInfo[].class).in(db).invoke();
}
@Test
public void class_registered_after_commit(){
DB db = DBMaker.memoryDB().make();
assertEquals(0, loadClassInfos(db).length);
assertEquals(0, unknownClasses(db).size());
//add some unknown class, DB should be notified
db.getStore().put(new Bean1("a","b"),db.getDefaultSerializer());
assertEquals(0, loadClassInfos(db).length);
assertEquals(1, unknownClasses(db).size());
//commit, class should become known
db.commit();
assertEquals(1, loadClassInfos(db).length);
assertEquals(0, unknownClasses(db).size());
}
@Test
public void testWriteReplace2() throws IOException {
File f = TT.tempFile();
Map m = new MM();
m.put("11", "111");
DB db = DBMaker.fileDB(f).make();
db.treeMap("map").create().put("key",m);
db.commit();
db.close();
db = DBMaker.fileDB(f).make();
assertEquals(new LinkedHashMap(m), db.treeMap("map").open().get("key"));
}
public static class SS implements Serializable{
protected final Map mm;
public SS(Map mm) {
this.mm = mm;
}
}
public static class MM extends AbstractMap implements Serializable{
Map m = new HashMap();
private Object writeReplace() throws ObjectStreamException {
return new LinkedHashMap(this);
}
@Override
public Set<Entry> entrySet() {
return m.entrySet();
}
@Override
public Object put(Object key, Object value) {
return m.put(key,value);
}
}
@Test
public void testWriteReplace2Wrap() throws IOException {
File f = TT.tempFile();
SS m = new SS(new MM());
m.mm.put("11", "111");
DB db = DBMaker.fileDB(f).make();
db.treeMap("map").create().put("key", m);
db.commit();
db.close();
db = DBMaker.fileDB(f).make();
assertEquals(new LinkedHashMap(m.mm), ((SS)db.treeMap("map").open().get("key")).mm);
}
@Test(expected = IllegalArgumentException.class)
public void pojo_serialization_writeReplace_in_object_graph() throws IOException, ClassNotFoundException {
DB db = DBMaker.heapDB().make();
TT.clone(new WriteReplaceBB(), db.getDefaultSerializer(), new DataOutput2());
}
static class WriteReplaceAA implements Serializable{
Object writeReplace() throws ObjectStreamException {
return "";
}
}
static class WriteReplaceBB implements Serializable{
WriteReplaceAA aa = new WriteReplaceAA();
}
}