From debe1f70bb0e3ec6e47f70bf5b1ed02d9a49ce52 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Sat, 20 Apr 2019 17:02:57 +0200 Subject: [PATCH] Fixed Tests --- .../strangedb/java/database/DatabaseJava.java | 8 ++-- .../java/database/DatabaseObjectsIO.java | 11 ++++- .../strangedb/java/database/ISerializer.java | 3 ++ .../java/database/KryoSerializer.java | 24 ++++++++-- .../strangedb/tests/ObjectListTests.java | 48 ++++++++++--------- .../strangedb/tests/Performance.java | 16 +++---- .../cavallium/strangedb/tests/QueryTests.java | 6 +-- .../cavallium/strangedb/utils/NTestUtils.java | 10 ++-- 8 files changed, 80 insertions(+), 46 deletions(-) diff --git a/src/main/java/it/cavallium/strangedb/java/database/DatabaseJava.java b/src/main/java/it/cavallium/strangedb/java/database/DatabaseJava.java index 7d429fa..b51cc74 100644 --- a/src/main/java/it/cavallium/strangedb/java/database/DatabaseJava.java +++ b/src/main/java/it/cavallium/strangedb/java/database/DatabaseJava.java @@ -173,12 +173,14 @@ public class DatabaseJava extends DatabaseCore implements IDatabaseTools { } } - protected void registerClass(Class type, int id) { + public void registerClass(Class type, int id) { this.objectsIO.registerClass(type, id); } protected DatabaseJava instantiateNewDatabase(Path dataFile, Path blocksMetaFile, Path referencesMetaFile) throws IOException { - return new DatabaseJava(dataFile, blocksMetaFile, referencesMetaFile); + DatabaseJava newDatabaseJava = new DatabaseJava(dataFile, blocksMetaFile, referencesMetaFile); + this.getObjectsIO().getRegisteredClasses().forEach(newDatabaseJava::registerClass); + return newDatabaseJava; } @Override @@ -187,7 +189,7 @@ public class DatabaseJava extends DatabaseCore implements IDatabaseTools { } @Override - public IObjectsIO getObjectsIO() { + public DatabaseObjectsIO getObjectsIO() { return objectsIO; } diff --git a/src/main/java/it/cavallium/strangedb/java/database/DatabaseObjectsIO.java b/src/main/java/it/cavallium/strangedb/java/database/DatabaseObjectsIO.java index 52c1620..fa283bd 100644 --- a/src/main/java/it/cavallium/strangedb/java/database/DatabaseObjectsIO.java +++ b/src/main/java/it/cavallium/strangedb/java/database/DatabaseObjectsIO.java @@ -443,6 +443,13 @@ public class DatabaseObjectsIO implements IObjectsIO { serializer.registerClass(type, realId); } + protected Map, Integer> getRegisteredClasses() { + Map, Integer> registeredClasses = serializer.getRegisteredClasses(); + registeredClasses.replaceAll((clazz,id) -> id - 100); + registeredClasses.entrySet().removeIf((entry) -> entry.getValue() < 0); + return registeredClasses; + } + private void preloadEnhancedObjectProperties(T obj, long[] propertyReferences) { // Declare the variables needed to getBlock the biggest property Id Method[] unorderedPropertyGetters = obj.getPropertyGetters(); @@ -621,7 +628,7 @@ public class DatabaseObjectsIO implements IObjectsIO { throws IOException { Object data = loadData_(fieldType, fieldReference); try { - if (fieldType == DbDataType.OBJECT && data != null) { + if (data != null) { if (!field.getType().isInstance(data)) { throw new IOException("There is an attempt to load an object of type " + data.getClass() + " into a field of type " + field.getType()); @@ -629,7 +636,7 @@ public class DatabaseObjectsIO implements IObjectsIO { } FieldUtils.writeField(field, obj, data, true); } catch (IllegalAccessException e) { - throw new RuntimeException(e); + throw new IOException(e); } } diff --git a/src/main/java/it/cavallium/strangedb/java/database/ISerializer.java b/src/main/java/it/cavallium/strangedb/java/database/ISerializer.java index 1fb1331..9ee7d35 100644 --- a/src/main/java/it/cavallium/strangedb/java/database/ISerializer.java +++ b/src/main/java/it/cavallium/strangedb/java/database/ISerializer.java @@ -1,6 +1,7 @@ package it.cavallium.strangedb.java.database; import java.io.IOException; +import java.util.Map; public interface ISerializer { Class readClassBytes(byte[] input) throws IOException; @@ -13,4 +14,6 @@ public interface ISerializer { T readClassAndObjectBytes(byte[] input) throws IOException; void registerClass(Class type, int id); + + Map, Integer> getRegisteredClasses(); } diff --git a/src/main/java/it/cavallium/strangedb/java/database/KryoSerializer.java b/src/main/java/it/cavallium/strangedb/java/database/KryoSerializer.java index 61102f3..eb17328 100644 --- a/src/main/java/it/cavallium/strangedb/java/database/KryoSerializer.java +++ b/src/main/java/it/cavallium/strangedb/java/database/KryoSerializer.java @@ -1,14 +1,12 @@ package it.cavallium.strangedb.java.database; import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.io.ByteBufferOutput; import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.KryoDataOutput; import com.esotericsoftware.kryo.io.Output; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantLock; @@ -19,6 +17,7 @@ public class KryoSerializer implements ISerializer { private ReentrantLock[] locks = new ReentrantLock[KRYO_INSTANCES]; private final Kryo[] kryo = new Kryo[KRYO_INSTANCES]; private AtomicInteger current = new AtomicInteger(0); + private ConcurrentHashMap, Integer> registeredClasses = new ConcurrentHashMap<>(200); public KryoSerializer() { for (int i = 0; i < KRYO_INSTANCES; i++) { @@ -85,6 +84,7 @@ public class KryoSerializer implements ISerializer { @Override public void registerClass(Class type, int id) { + registeredClasses.put(type, id); for (int i = 0; i < KRYO_INSTANCES; i++) { locks[i].lock(); try { @@ -94,4 +94,18 @@ public class KryoSerializer implements ISerializer { } } } + + @Override + public Map, Integer> getRegisteredClasses() { + for (int i = 0; i < KRYO_INSTANCES; i++) { + locks[i].lock(); + } + try { + return new HashMap<>(registeredClasses); + } finally { + for (int i = 0; i < KRYO_INSTANCES; i++) { + locks[i].unlock(); + } + } + } } diff --git a/src/test/java/it/cavallium/strangedb/tests/ObjectListTests.java b/src/test/java/it/cavallium/strangedb/tests/ObjectListTests.java index 784337e..6fd0f55 100644 --- a/src/test/java/it/cavallium/strangedb/tests/ObjectListTests.java +++ b/src/test/java/it/cavallium/strangedb/tests/ObjectListTests.java @@ -7,6 +7,8 @@ import it.cavallium.strangedb.java.database.IDatabaseTools; import it.cavallium.strangedb.java.objects.EnhancedObject; import it.cavallium.strangedb.java.objects.lists.EnhancedObjectStrangeDbList; import it.cavallium.strangedb.java.objects.lists.ObjectStrangeDbList; +import it.cavallium.strangedb.utils.NSimplestClass; +import it.cavallium.strangedb.utils.NTestUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -30,54 +32,56 @@ public class ObjectListTests { path2 = Files.createTempFile("db-tests-blocks-", ".db"); path3 = Files.createTempFile("db-tests-references-", ".db"); db = new DatabaseJava(path1, path2, path3); + registerClasses(); ListsRoot root = db.loadRoot(ListsRoot::new); - for (int i = 0; i < 5000; i++) { + for (int i = 0; i < 500; i++) { root.objectList.add(new ObjectItem(i)); root.enhancedObjectList.add(new EnhancedObjectItem(db, i)); } - for (int i = 0; i < 5000; i++) { + for (int i = 0; i < 500; i++) { if (i % 10 == 0) { root.objectList.update(i, new ObjectItem(i)); root.enhancedObjectList.update(i, new EnhancedObjectItem(db, i)); } } - for (int i = 0; i < 5000; i++) { + for (int i = 0; i < 500; i++) { if (i % 11 == 0) { root.objectList.set(i, new ObjectItem(i)); root.enhancedObjectList.set(i, new EnhancedObjectItem(db, i)); } } - for (int i = 5000; i < 6000; i++) { + for (int i = 500; i < 600; i++) { root.objectList.add(new ObjectItem(0)); root.enhancedObjectList.add(i, new EnhancedObjectItem(db, 0)); } db.close(); } + private void registerClasses() { + int id = 0; + db.registerClass(EnhancedObjectItem.class, id++); + db.registerClass(ListsRoot.class, id++); + db.registerClass(ObjectItem.class, id++); + } + @Test public void shouldUpdateClass() throws IOException { db = new DatabaseJava(path1, path2, path3); + registerClasses(); ListsRoot root = db.loadRoot(ListsRoot::new); - new Thread(() -> { - try { - for (int i = 0; i < 5000; i++) { - String val = root.objectList.get(i).value; - assertEquals(val, "test_" + i); - val = root.enhancedObjectList.get(i).value; - assertEquals(val, "test_" + i); - } - for (int i = 5000; i < 6000; i++) { - assertEquals(root.objectList.get(i).value, "test_" + 0); - assertEquals(root.enhancedObjectList.get(i).value, "test_" + 0); - } - } catch (IOException e) { - e.printStackTrace(); - } - }).start(); try { - Thread.sleep(10000); - } catch (InterruptedException e) { + for (int i = 0; i < 500; i++) { + String val = root.objectList.get(i).value; + assertEquals(val, "test_" + i); + val = root.enhancedObjectList.get(i).value; + assertEquals(val, "test_" + i); + } + for (int i = 500; i < 600; i++) { + assertEquals(root.objectList.get(i).value, "test_" + 0); + assertEquals(root.enhancedObjectList.get(i).value, "test_" + 0); + } + } catch (IOException e) { e.printStackTrace(); } db.close(); diff --git a/src/test/java/it/cavallium/strangedb/tests/Performance.java b/src/test/java/it/cavallium/strangedb/tests/Performance.java index ee3b75c..af2d22a 100644 --- a/src/test/java/it/cavallium/strangedb/tests/Performance.java +++ b/src/test/java/it/cavallium/strangedb/tests/Performance.java @@ -310,14 +310,14 @@ public class Performance { Files.createFile(dbReferencesFile); db = new DatabaseJava(dbDataFile, dbBlocksFile, dbReferencesFile); int i = 0; - db.getObjectsIO().registerClass(SimpleEnhancedObject.class, i++); - db.getObjectsIO().registerClass(PreloadedListContainer.class, i++); - db.getObjectsIO().registerClass(DynamicListContainer.class, i++); - db.getObjectsIO().registerClass(EMessage.class, i++); - db.getObjectsIO().registerClass(EMessageContent.class, i++); - db.getObjectsIO().registerClass(EMessageText.class, i++); - db.getObjectsIO().registerClass(EMessageOtherContent.class, i++); - db.getObjectsIO().registerClass(EFormattedText.class, i++); + db.registerClass(SimpleEnhancedObject.class, i++); + db.registerClass(PreloadedListContainer.class, i++); + db.registerClass(DynamicListContainer.class, i++); + db.registerClass(EMessage.class, i++); + db.registerClass(EMessageContent.class, i++); + db.registerClass(EMessageText.class, i++); + db.registerClass(EMessageOtherContent.class, i++); + db.registerClass(EFormattedText.class, i++); } public static void deleteDb() throws IOException { diff --git a/src/test/java/it/cavallium/strangedb/tests/QueryTests.java b/src/test/java/it/cavallium/strangedb/tests/QueryTests.java index 76b24cf..01673f6 100644 --- a/src/test/java/it/cavallium/strangedb/tests/QueryTests.java +++ b/src/test/java/it/cavallium/strangedb/tests/QueryTests.java @@ -33,9 +33,9 @@ public class QueryTests { path3 = Files.createTempFile("db-tests-references-", ".db"); db = new DatabaseJava(path1, path2, path3); int i = 0; - db.getObjectsIO().registerClass(UserFullInfo.class, i++); - db.getObjectsIO().registerClass(User.class, i++); - db.getObjectsIO().registerClass(ListContainer.class, i++); + db.registerClass(UserFullInfo.class, i++); + db.registerClass(User.class, i++); + db.registerClass(ListContainer.class, i++); } @Test diff --git a/src/test/java/it/cavallium/strangedb/utils/NTestUtils.java b/src/test/java/it/cavallium/strangedb/utils/NTestUtils.java index 3634f9e..4c07e04 100644 --- a/src/test/java/it/cavallium/strangedb/utils/NTestUtils.java +++ b/src/test/java/it/cavallium/strangedb/utils/NTestUtils.java @@ -43,12 +43,16 @@ public class NTestUtils { public WrappedDb create(ConsumerWithIO r) throws IOException { this.r = () -> r.accept(WrappedDb.this); - this.create(); - return this; + return this.create(); } private DatabaseJava openDatabase() throws IOException { - return new DatabaseJava(tempDir.resolve(Paths.get("data.db")), tempDir.resolve(Paths.get("blocks.dat")), tempDir.resolve(Paths.get("references.dat"))); + DatabaseJava db = new DatabaseJava(tempDir.resolve(Paths.get("data.db")), tempDir.resolve(Paths.get("blocks.dat")), tempDir.resolve(Paths.get("references.dat"))); + int id = 0; + db.registerClass(RootClass.class, id++); + db.registerClass(LongArrayList.class, id++); + db.registerClass(NSimplestClass.class, id++); + return db; } public void delete() throws IOException {