package org.geotools.mbtiles;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicLong;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geotools.util.logging.Logging;
import org.junit.Test;
public class MBTilesFileTest {
private static final Logger LOGGER = Logging.getLogger(MBTilesFileTest.class);
@Test
public void testMBTilesMetaData() throws IOException {
MBTilesFile file = new MBTilesFile();
file.init();
MBTilesMetadata metadata = new MBTilesMetadata();
metadata.setName("dummy name");
metadata.setDescription("dummy description");
metadata.setVersion("dummy version");
metadata.setBoundsStr("0,0,100,100");
metadata.setFormatStr("png");
metadata.setTypeStr("overlay");
metadata.setMinZoomStr("0");
metadata.setMaxZoomStr("5");
file.saveMetaData(metadata);
MBTilesMetadata metadata2 = file.loadMetaData();
assertEquals(metadata.getName(), metadata2.getName());
assertEquals(metadata.getDescription(), metadata2.getDescription());
assertEquals(metadata.getVersion(), metadata2.getVersion());
assertEquals(metadata.getBounds(), metadata2.getBounds());
assertEquals(metadata.getFormat(), metadata2.getFormat());
assertEquals(metadata.getType(), metadata2.getType());
assertEquals(metadata.getMinZoom(), metadata2.getMinZoom());
assertEquals(metadata.getMaxZoom(), metadata2.getMaxZoom());
file.close();
}
@Test
public void testMBTilesInitTwice() throws IOException {
MBTilesFile file = new MBTilesFile();
file.init();
file.init();
}
@Test
public void testMBTilesWithoutJournal() throws IOException {
// Create the temporary file
File temp = File.createTempFile("temp2_", ".mbtiles");
MBTilesFile file = new MBTilesFile(temp,true);
file.init();
// Define the Journal file
final File journal = new File(temp.getAbsolutePath() + "-journal");
// Initialize the journal file
final AtomicLong counter = new AtomicLong(0);
// Define a counter thread
Thread th = new Thread(new Runnable() {
@Override
public void run() {
while(true){
if(journal.exists()){
counter.incrementAndGet();
}
}
}
});
// launch the thread
th.start();
// add data to the mbtile
for(int i = 0; i< 10; i++){
for(int j = 0; j< 10; j++){
MBTilesTile tile1 = new MBTilesTile(1,i,j);
tile1.setData("dummy data 1".getBytes());
file.saveTile(tile1);
}
}
// Stop the thread
try{
th.interrupt();
}catch(Exception e ){
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
// Close files
try{
file.close();
}catch(Exception e ){
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
try{
temp.delete();
}catch(Exception e ){
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
// Ensure journal has never been found
assertTrue(counter.get() == 0);
}
@Test
public void testMBTilesMinMaxZoomLevelMetaData() throws IOException, SQLException {
MBTilesFile file = new MBTilesFile();
file.init();
file.saveMinMaxZoomMetadata(0, 14);
MBTilesMetadata metadata = file.loadMetaData();
assertEquals(0, metadata.getMinZoom());
assertEquals(14, metadata.getMaxZoom());
}
@Test
public void testMBTilesTile() throws IOException, SQLException {
MBTilesFile file = new MBTilesFile();
file.init();
MBTilesTile tile1 = new MBTilesTile(1,0,0);
tile1.setData("dummy data 1".getBytes());
MBTilesTile tile2 = new MBTilesTile(2,0,1);
tile2.setData("dummy data 2".getBytes());
file.saveTile(tile1);
file.saveTile(tile2);
MBTilesTile testTile = file.loadTile(1,0,0);
assertTrue(Arrays.equals(tile1.getData(), testTile.getData()));
testTile = file.loadTile(2,0,1);
assertTrue(Arrays.equals(tile2.getData(), testTile.getData()));
assertEquals(2, file.numberOfTiles());
MBTilesFile.TileIterator it = file.tiles();
assertTrue(it.hasNext());
assertNotNull(it.next());
assertTrue(it.hasNext());
assertNotNull(it.next());
assertFalse(it.hasNext());
assertEquals(1, file.minZoom());
assertEquals(2, file.maxZoom());
assertEquals(2, file.closestZoom(5));
assertEquals(1, file.closestZoom(1));
assertEquals(0, file.minColumn(1));
assertEquals(0, file.maxColumn(2));
assertEquals(0, file.minRow(1));
assertEquals(1, file.maxRow(2));
file.close();
}
@Test
public void testMBTilesGrid() throws IOException, SQLException {
MBTilesFile file = new MBTilesFile();
file.init();
MBTilesGrid grid1 = new MBTilesGrid(1,0,0);
grid1.setGrid("dummy data 1".getBytes());
grid1.setGridDataKey("key1", "dummy value1");
grid1.setGridDataKey("key2", "dummy value2");
MBTilesGrid grid2 = new MBTilesGrid(2,0,1);
grid2.setGridDataKey("key3", "dummy value3");
grid2.setGridDataKey("key4", "dummy value4");
grid2.setGrid("dummy data 2".getBytes());
file.saveGrid(grid1);
file.saveGrid(grid2);
MBTilesGrid testGrid = file.loadGrid(1,0,0);
assertTrue(Arrays.equals(grid1.getGrid(), testGrid.getGrid()));
assertEquals(grid1.getGridDataKey("key1"), grid1.getGridDataKey("key1"));
assertEquals(grid1.getGridDataKey("key2"), grid1.getGridDataKey("key2"));
testGrid = file.loadGrid(2,0,1);
assertTrue(Arrays.equals(grid2.getGrid(), testGrid.getGrid()));
assertEquals(grid2.getGridDataKey("key3"), grid2.getGridDataKey("key3"));
assertEquals(grid2.getGridDataKey("key4"), grid2.getGridDataKey("key4"));
}
}