/**
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @author Arne Kepp / The Open Planning Project 2009
*
*/
package org.geowebcache.storage;
import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.easymock.classextension.EasyMock;
import org.geowebcache.grid.SRS;
import org.geowebcache.io.ByteArrayResource;
import org.geowebcache.io.Resource;
import org.geowebcache.mime.ImageMime;
import org.geowebcache.mime.MimeType;
import org.geowebcache.storage.blobstore.file.FileBlobStore;
public class BlobStoreTest extends TestCase {
public static final String TEST_BLOB_DIR_NAME = "gwcTestBlobs";
public void testTile() throws Exception {
FileBlobStore fbs = setup();
Resource bytes = new ByteArrayResource("1 2 3 4 5 6 test".getBytes());
long[] xyz = { 1L, 2L, 3L };
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("a", "x");
parameters.put("b", "ø");
TileObject to = TileObject.createCompleteTileObject("test:123123 112", xyz, "EPSG:4326",
"image/jpeg", parameters, bytes);
to.setId(11231231);
fbs.put(to);
TileObject to2 = TileObject.createQueryTileObject("test:123123 112", xyz, "EPSG:4326",
"image/jpeg", parameters);
to2.setId(11231231);
fbs.get(to2);
assertEquals(to.getBlobFormat(), to2.getBlobFormat());
InputStream is = to.getBlob().getInputStream();
InputStream is2 = to2.getBlob().getInputStream();
try {
assertTrue(IOUtils.contentEquals(is, is2));
} finally {
is.close();
is2.close();
}
}
public void testTileDelete() throws Exception {
FileBlobStore fbs = setup();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("a", "x");
parameters.put("b", "ø");
Resource bytes = new ByteArrayResource("1 2 3 4 5 6 test".getBytes());
long[] xyz = { 5L, 6L, 7L };
TileObject to = TileObject.createCompleteTileObject("test:123123 112", xyz, "EPSG:4326",
"image/jpeg", parameters, bytes);
to.setId(11231231);
fbs.put(to);
TileObject to2 = TileObject.createQueryTileObject("test:123123 112", xyz, "EPSG:4326",
"image/jpeg", parameters);
to2.setId(11231231);
fbs.get(to2);
InputStream is = to2.getBlob().getInputStream();
InputStream is2 = bytes.getInputStream();
try {
assertTrue(IOUtils.contentEquals(is, is2));
} finally {
is.close();
is2.close();
}
TileObject to3 = TileObject.createQueryTileObject("test:123123 112", xyz, "EPSG:4326",
"image/jpeg", parameters);
fbs.delete(to3);
TileObject to4 = TileObject.createQueryTileObject("test:123123 112", xyz, "EPSG:4326",
"image/jpeg", parameters);
assertFalse(fbs.get(to4));
}
public void testTilRangeDelete() throws Exception {
FileBlobStore fbs = setup();
Resource bytes = new ByteArrayResource("1 2 3 4 5 6 test".getBytes());
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("a", "x");
parameters.put("b", "ø");
MimeType mime = ImageMime.png;
SRS srs = SRS.getEPSG4326();
String layerName = "test:123123 112";
int zoomLevel = 7;
int x = 25;
int y = 6;
// long[] origXYZ = {x,y,zoomLevel};
TileObject[] tos = new TileObject[6];
for (int i = 0; i < tos.length; i++) {
long[] xyz = { x + i - 1, y, zoomLevel };
tos[i] = TileObject.createCompleteTileObject(layerName, xyz, srs.toString(),
mime.getFormat(), parameters, bytes);
fbs.put(tos[i]);
}
long[][] rangeBounds = new long[zoomLevel + 2][5];
int zoomStart = zoomLevel - 1;
int zoomStop = zoomLevel + 1;
long[] range = { x, y, x + tos.length - 3, y, zoomLevel};
rangeBounds[zoomLevel] = range;
TileRange trObj = new TileRange(layerName, srs.toString(), zoomStart, zoomStop,
rangeBounds, mime, parameters);
fbs.delete(trObj);
// starting x and x + tos.length should have data, the remaining should not
TileObject firstTO = TileObject.createQueryTileObject(layerName, tos[0].xyz,
srs.toString(), mime.getFormat(), parameters);
fbs.get(firstTO);
InputStream is = firstTO.getBlob().getInputStream();
InputStream is2 = bytes.getInputStream();
try {
assertTrue(IOUtils.contentEquals(is, is2));
} finally {
is.close();
is2.close();
}
TileObject lastTO = TileObject.createQueryTileObject(layerName, tos[tos.length - 1].xyz,
srs.toString(), mime.getFormat(), parameters);
fbs.get(lastTO);
is = lastTO.getBlob().getInputStream();
is2 = bytes.getInputStream();
try {
assertTrue(IOUtils.contentEquals(is, is2));
} finally {
is.close();
is2.close();
}
TileObject midTO = TileObject.createQueryTileObject(layerName,
tos[(tos.length - 1) / 2].xyz, srs.toString(), mime.getFormat(), parameters);
fbs.get(midTO);
Resource res = midTO.getBlob();
assertNull(res);
}
public void testRenameLayer() throws Exception {
FileBlobStore fbs = setup();
Resource bytes = new ByteArrayResource("1 2 3 4 5 6 test".getBytes());
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("a", "x");
parameters.put("b", "ø");
MimeType mime = ImageMime.png;
SRS srs = SRS.getEPSG4326();
final String layerName = "test:123123 112";
int zoomLevel = 7;
int x = 25;
int y = 6;
// long[] origXYZ = {x,y,zoomLevel};
TileObject[] tos = new TileObject[6];
for (int i = 0; i < tos.length; i++) {
long[] xyz = { x + i - 1, y, zoomLevel };
tos[i] = TileObject.createCompleteTileObject(layerName, xyz, srs.toString(),
mime.getFormat(), parameters, bytes);
fbs.put(tos[i]);
}
final String newLayerName = "modifiedLayerName";
BlobStoreListener listener = EasyMock.createNiceMock(BlobStoreListener.class);
listener.layerRenamed(EasyMock.eq(layerName), EasyMock.eq(newLayerName));
EasyMock.replay(listener);
fbs.addListener(listener);
boolean renamed = fbs.rename(layerName, newLayerName);
assertTrue(renamed);
EasyMock.verify(listener);
try {
fbs.rename(layerName, newLayerName);
fail("Expected StorageException, target dir already exists");
} catch (StorageException e) {
assertTrue(true);
}
}
public FileBlobStore setup() throws Exception {
File fh = new File(StorageBrokerTest.findTempDir() + File.separator + TEST_BLOB_DIR_NAME);
if (fh.exists()) {
FileUtils.deleteDirectory(fh);
}
if (!fh.exists() && !fh.mkdirs()) {
throw new StorageException("Unable to create " + fh.getAbsolutePath());
}
return new FileBlobStore(StorageBrokerTest.findTempDir() + File.separator
+ TEST_BLOB_DIR_NAME);
}
public void testLayerMetadata() throws Exception {
FileBlobStore fbs = setup();
final String layerName = "TestLayer";
final String key1 = "Test.Metadata.Property_1";
final String key2 = "Test.Metadata.Property_2";
assertNull(fbs.getLayerMetadata(layerName, key1));
assertNull(fbs.getLayerMetadata(layerName, key2));
fbs.putLayerMetadata(layerName, key1, "value 1");
fbs.putLayerMetadata(layerName, key2, "value 2");
assertEquals("value 1", fbs.getLayerMetadata(layerName, key1));
assertEquals("value 2", fbs.getLayerMetadata(layerName, key2));
fbs.putLayerMetadata(layerName, key1, "value 1_1");
fbs.putLayerMetadata(layerName, key2, null);
assertEquals("value 1_1", fbs.getLayerMetadata(layerName, key1));
assertNull(fbs.getLayerMetadata(layerName, key2));
}
}