skeleton test framework

master
Thomas Rudin 2018-11-27 14:49:16 +01:00
parent bb274bd9ab
commit da023c4cc4
10 changed files with 244 additions and 8 deletions

22
pom.xml
View File

@ -96,12 +96,6 @@
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- Guava -->
@ -173,6 +167,22 @@
<version>3.5.2</version>
</dependency>
<!-- Testing -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>

View File

@ -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;

View File

@ -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();

View File

@ -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<BlocksRecord> stride = blocksRecordService.getTopDownYStride(0, 0, -1, 16);
for (BlocksRecord record: stride){
System.out.println(new Coordinate(record) + ":" + record.getData().length);
}
}
}

View File

@ -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(){}
}

View File

@ -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<String, String> 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(){
}
}

View File

@ -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);
}
}

View File

@ -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<Coordinate, BlocksRecord> cache = new HashMap<>();
@Override
public List<BlocksRecord> getTopDownYStride(int x, int z, int minY, int maxY) {
List<BlocksRecord> result = new ArrayList<>();
for (int y=minY; y<=maxY; y++){
Coordinate coordinate = new Coordinate(x, y, z);
Optional<BlocksRecord> 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<BlocksRecord> 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);
}
}

View File

@ -12,7 +12,6 @@
<logger name="io.rudin.minetest.tileserver.TileRenderer" level="DEBUG"/>
<root level="info">
<appender-ref ref="logfile" />
<appender-ref ref="console" />
</root>

View File

@ -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)
);