diff --git a/pom.xml b/pom.xml
index 3d77519..028a914 100644
--- a/pom.xml
+++ b/pom.xml
@@ -96,12 +96,6 @@
1.2.3
-
- junit
- junit
- 4.12
- test
-
@@ -173,6 +167,22 @@
3.5.2
+
+
+ com.h2database
+ h2
+ 1.4.197
+ test
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
diff --git a/src/main/java/io/rudin/minetest/tileserver/accessor/Coordinate.java b/src/main/java/io/rudin/minetest/tileserver/accessor/Coordinate.java
index e90b703..5b147ab 100644
--- a/src/main/java/io/rudin/minetest/tileserver/accessor/Coordinate.java
+++ b/src/main/java/io/rudin/minetest/tileserver/accessor/Coordinate.java
@@ -27,6 +27,15 @@ public class Coordinate {
public final int x, y, z;
+ @Override
+ public String toString() {
+ return "Coordinate{" +
+ "x=" + x +
+ ", y=" + y +
+ ", z=" + z +
+ '}';
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
diff --git a/src/main/java/io/rudin/minetest/tileserver/service/impl/BlocksRecordDatabaseService.java b/src/main/java/io/rudin/minetest/tileserver/service/impl/BlocksRecordDatabaseService.java
index d4042a3..23124a8 100644
--- a/src/main/java/io/rudin/minetest/tileserver/service/impl/BlocksRecordDatabaseService.java
+++ b/src/main/java/io/rudin/minetest/tileserver/service/impl/BlocksRecordDatabaseService.java
@@ -85,7 +85,7 @@ public class BlocksRecordDatabaseService
return list;
}
- private File getLocalMapBlockFile(Coordinate coordinate){
+ public static File getLocalMapBlockFile(Coordinate coordinate){
File mapblockDir = new File("mapblocks");
if (!mapblockDir.isDirectory())
mapblockDir.mkdir();
diff --git a/src/test/java/io/rudin/minetest/tileserver/BlocksRecordServiceTest.java b/src/test/java/io/rudin/minetest/tileserver/BlocksRecordServiceTest.java
new file mode 100644
index 0000000..6e2f124
--- /dev/null
+++ b/src/test/java/io/rudin/minetest/tileserver/BlocksRecordServiceTest.java
@@ -0,0 +1,26 @@
+package io.rudin.minetest.tileserver;
+
+import io.rudin.minetest.tileserver.accessor.Coordinate;
+import io.rudin.minetest.tileserver.base.TileServerTest;
+import io.rudin.minetest.tileserver.blockdb.tables.records.BlocksRecord;
+import io.rudin.minetest.tileserver.service.BlocksRecordService;
+import org.junit.Test;
+
+import javax.inject.Inject;
+import java.util.List;
+
+public class BlocksRecordServiceTest extends TileServerTest {
+
+ @Inject BlocksRecordService blocksRecordService;
+
+ @Test
+ public void test(){
+
+ List stride = blocksRecordService.getTopDownYStride(0, 0, -1, 16);
+
+ for (BlocksRecord record: stride){
+ System.out.println(new Coordinate(record) + ":" + record.getData().length);
+ }
+
+ }
+}
diff --git a/src/test/java/io/rudin/minetest/tileserver/UnitTestValidation.java b/src/test/java/io/rudin/minetest/tileserver/UnitTestValidation.java
new file mode 100644
index 0000000..f8af0a4
--- /dev/null
+++ b/src/test/java/io/rudin/minetest/tileserver/UnitTestValidation.java
@@ -0,0 +1,10 @@
+package io.rudin.minetest.tileserver;
+
+import io.rudin.minetest.tileserver.base.TileServerTest;
+import org.junit.Test;
+
+public class UnitTestValidation extends TileServerTest {
+
+ @Test
+ public void validateTestSetup(){}
+}
diff --git a/src/test/java/io/rudin/minetest/tileserver/base/TileServerTest.java b/src/test/java/io/rudin/minetest/tileserver/base/TileServerTest.java
new file mode 100644
index 0000000..3707350
--- /dev/null
+++ b/src/test/java/io/rudin/minetest/tileserver/base/TileServerTest.java
@@ -0,0 +1,59 @@
+package io.rudin.minetest.tileserver.base;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import io.rudin.minetest.tileserver.DBMigration;
+import io.rudin.minetest.tileserver.config.TileServerConfig;
+import io.rudin.minetest.tileserver.module.ConfigModule;
+import io.rudin.minetest.tileserver.module.DBModule;
+import io.rudin.minetest.tileserver.module.ServiceModule;
+import io.rudin.minetest.tileserver.module.TestServiceModule;
+import io.rudin.minetest.tileserver.qualifier.MapDB;
+import org.aeonbits.owner.ConfigFactory;
+import org.junit.After;
+import org.junit.Before;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class TileServerTest {
+
+ @Before
+ public void init() throws SQLException {
+ Map properties = new HashMap<>();
+ properties.put("minetest.db.url", "jdbc:h2:mem:tileserver");
+ properties.put("minetest.db.username", "sa");
+ properties.put("minetest.db.password", "");
+ properties.put("minetest.db.driver", "org.h2.Driver");
+
+ TileServerConfig cfg = ConfigFactory.create(TileServerConfig.class, properties);
+
+ injector = Guice.createInjector(
+ new ConfigModule(cfg),
+ new DBModule(cfg),
+ new TestServiceModule()
+ );
+
+ DataSource dataSource = injector.getInstance(Key.get(DataSource.class, MapDB.class));
+ try (Connection connection = dataSource.getConnection()){
+ connection.createStatement().execute("runscript from 'classpath:/minetest-db.sql'");
+ }
+
+ //does not work: create function plsql not available in h2
+ //injector.getInstance(DBMigration.class).migrate();
+
+ injector.injectMembers(this);
+ }
+
+ private Injector injector;
+
+ @After
+ public void after(){
+ }
+
+}
diff --git a/src/test/java/io/rudin/minetest/tileserver/module/TestServiceModule.java b/src/test/java/io/rudin/minetest/tileserver/module/TestServiceModule.java
new file mode 100644
index 0000000..1cf5d22
--- /dev/null
+++ b/src/test/java/io/rudin/minetest/tileserver/module/TestServiceModule.java
@@ -0,0 +1,34 @@
+package io.rudin.minetest.tileserver.module;
+
+import com.google.inject.AbstractModule;
+import io.rudin.minetest.tileserver.ColorTable;
+import io.rudin.minetest.tileserver.config.LayerConfig;
+import io.rudin.minetest.tileserver.config.TileServerConfig;
+import io.rudin.minetest.tileserver.provider.ColorTableProvider;
+import io.rudin.minetest.tileserver.provider.ExecutorProvider;
+import io.rudin.minetest.tileserver.provider.LayerConfigProvider;
+import io.rudin.minetest.tileserver.service.BlocksRecordLocalService;
+import io.rudin.minetest.tileserver.service.BlocksRecordService;
+import io.rudin.minetest.tileserver.service.EventBus;
+import io.rudin.minetest.tileserver.service.TileCache;
+import io.rudin.minetest.tileserver.service.impl.*;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
+
+public class TestServiceModule extends AbstractModule {
+
+
+ @Override
+ protected void configure() {
+
+ bind(TileCache.class).to(FileTileCache.class);
+ bind(EventBus.class).to(EventBusImpl.class);
+ bind(ColorTable.class).toProvider(ColorTableProvider.class);
+ bind(ExecutorService.class).toProvider(ExecutorProvider.class);
+ bind(ScheduledExecutorService.class).toProvider(ExecutorProvider.class);
+ bind(LayerConfig.class).toProvider(LayerConfigProvider.class);
+
+ bind(BlocksRecordService.class).to(BlocksRecordLocalService.class);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/io/rudin/minetest/tileserver/service/BlocksRecordLocalService.java b/src/test/java/io/rudin/minetest/tileserver/service/BlocksRecordLocalService.java
new file mode 100644
index 0000000..a79e99b
--- /dev/null
+++ b/src/test/java/io/rudin/minetest/tileserver/service/BlocksRecordLocalService.java
@@ -0,0 +1,80 @@
+package io.rudin.minetest.tileserver.service;
+
+import io.rudin.minetest.tileserver.accessor.Coordinate;
+import io.rudin.minetest.tileserver.blockdb.tables.records.BlocksRecord;
+import io.rudin.minetest.tileserver.service.impl.BlocksRecordDatabaseService;
+import io.rudin.minetest.tileserver.util.StreamUtil;
+import sun.security.action.OpenFileInputStreamAction;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.*;
+
+public class BlocksRecordLocalService implements BlocksRecordService {
+
+ private final Map cache = new HashMap<>();
+
+ @Override
+ public List getTopDownYStride(int x, int z, int minY, int maxY) {
+
+ List result = new ArrayList<>();
+
+ for (int y=minY; y<=maxY; y++){
+ Coordinate coordinate = new Coordinate(x, y, z);
+
+ Optional optionalRecord = get(coordinate);
+ if (optionalRecord.isPresent())
+ result.add(optionalRecord.get());
+ }
+
+ result.sort(Comparator.comparingInt(BlocksRecord::getPosy));
+
+ return result;
+ }
+
+ public static File getLocalMapBlockFile(Coordinate coordinate){
+ File mapblockDir = new File("testdata/mapblocks");
+ if (!mapblockDir.isDirectory())
+ mapblockDir.mkdir();
+
+ return new File(mapblockDir, coordinate.x + "." + coordinate.y + "." + coordinate.z);
+ }
+
+ @Override
+ public Optional get(Coordinate coords) {
+ BlocksRecord record = cache.get(coords);
+
+ if (record != null)
+ return Optional.of(record);
+
+ File file = getLocalMapBlockFile(coords);
+
+ if (!file.isFile())
+ return Optional.empty();
+
+ try (InputStream input = new FileInputStream(file)){
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ StreamUtil.copyStream(input, output);
+
+ record = new BlocksRecord();
+ record.setData(output.toByteArray());
+ record.setMtime(file.lastModified());
+ record.setPosx(coords.x);
+ record.setPosy(coords.y);
+ record.setPosz(coords.z);
+ cache.put(coords, record);
+ return Optional.of(record);
+
+ } catch (Exception e){
+ throw new IllegalArgumentException(e);
+ }
+
+ }
+
+ @Override
+ public void update(BlocksRecord block) {
+ cache.put(new Coordinate(block), block);
+ }
+}
diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml
index 15033a8..420af88 100644
--- a/src/test/resources/logback-test.xml
+++ b/src/test/resources/logback-test.xml
@@ -12,7 +12,6 @@
-
diff --git a/src/test/resources/minetest-db.sql b/src/test/resources/minetest-db.sql
new file mode 100644
index 0000000..9e8c439
--- /dev/null
+++ b/src/test/resources/minetest-db.sql
@@ -0,0 +1,9 @@
+
+create table blocks(
+ posx int not null,
+ posy int not null,
+ posz int not null,
+ data bytea,
+
+ PRIMARY KEY(posx,posy,posz)
+);
\ No newline at end of file