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