/* (c) 2016 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geogig.geoserver.gwc; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.Map; import org.geogig.geoserver.GeoGigTestData; import org.geogig.geoserver.GeoGigTestData.CatalogBuilder; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.LayerInfo; import org.geoserver.data.test.SystemTestData; import org.geoserver.gwc.GWC; import org.geoserver.gwc.config.GWCConfig; import org.geoserver.gwc.layer.GeoServerTileLayer; import org.geoserver.test.GeoServerSystemTestSupport; import org.geoserver.test.TestSetup; import org.geoserver.test.TestSetupFrequency; import org.geowebcache.GeoWebCacheExtensions; import org.geowebcache.conveyor.Conveyor.CacheResult; import org.geowebcache.conveyor.ConveyorTile; import org.geowebcache.grid.GridSubset; import org.geowebcache.mime.MimeType; import org.geowebcache.storage.StorageBroker; import org.junit.Rule; import org.junit.Test; import org.opengis.feature.simple.SimpleFeature; import com.mockrunner.mock.web.MockHttpServletRequest; import com.mockrunner.mock.web.MockHttpServletResponse; import com.vividsolutions.jts.geom.Envelope; /** * Integration test for GeoServer cached layers using the GWC REST API * */ @TestSetup(run = TestSetupFrequency.REPEAT) public class GWCIntegrationTest extends GeoServerSystemTestSupport { private GWC mediator; private GeoServerTileLayer pointsLayer; private GeoServerTileLayer linesLayer; private StorageBroker storageBroker; @Rule public GeoGigTestData geogigData = new GeoGigTestData(); @Override protected void onSetUp(SystemTestData testData) throws Exception { geogigData.init()// .config("user.name", "gabriel")// .config("user.email", "gabriel@test.com")// .createTypeTree("lines", "geom:LineString:srid=4326")// .createTypeTree("points", "geom:Point:srid=4326")// .add()// .commit("created type trees")// .get(); geogigData.insert("points",// "p1=geom:POINT(0 0)",// "p2=geom:POINT(1 1)",// "p3=geom:POINT(2 2)"); geogigData.insert("lines",// "l1=geom:LINESTRING(-10 0, 10 0)",// "l2=geom:LINESTRING(0 0, 180 0)"); geogigData.add().commit("Added test features"); mediator = GWC.get(); assertNotNull(mediator); storageBroker = GeoWebCacheExtensions.bean(StorageBroker.class); assertNotNull(storageBroker); GWCConfig config = mediator.getConfig(); config.setCacheLayersByDefault(true); mediator.saveConfig(config); Catalog catalog = getCatalog(); CatalogBuilder catalogBuilder = geogigData.newCatalogBuilder(catalog); catalogBuilder.addAllRepoLayers().build(); String layerName = catalogBuilder.workspaceName() + ":points"; LayerInfo pointLayerInfo = catalog.getLayerByName(layerName); assertNotNull(pointLayerInfo); pointsLayer = mediator.getTileLayer(pointLayerInfo); assertNotNull(pointsLayer); pointsLayer.getInfo().setExpireCache(10 * 1000); mediator.save(pointsLayer); layerName = catalogBuilder.workspaceName() + ":lines"; LayerInfo lineLayerInfo = catalog.getLayerByName(layerName); assertNotNull(lineLayerInfo); linesLayer = mediator.getTileLayer(lineLayerInfo); assertNotNull(lineLayerInfo); } @Override protected void onTearDown(SystemTestData testData) throws Exception { getCatalog().dispose(); } /** * Override so that default layers are not added */ @Override protected void setUpTestData(SystemTestData testData) throws Exception { // } @Test public void testRemoveSingleFeature() throws Exception { ConveyorTile tile = createTileProto(pointsLayer); SimpleFeature feature = geogigData.getFeature("points/p2");// POINT(1 1) Envelope bounds = (Envelope) feature.getBounds(); org.geowebcache.grid.BoundingBox featureBounds = new org.geowebcache.grid.BoundingBox( bounds.getMinX(), bounds.getMinY(), bounds.getMaxX(), bounds.getMaxY()); GridSubset gridSubset = pointsLayer.getGridSubset(tile.getGridSetId()); long[][] featureCoverages = gridSubset.getCoverageIntersections(featureBounds); int level = 4; long[] levelCoverageIntersection = featureCoverages[level]; final long tileX = levelCoverageIntersection[0]; final long tileY = levelCoverageIntersection[1]; long[] xyz = tile.getStorageObject().getXYZ(); xyz[0] = tileX; xyz[1] = tileY; xyz[2] = level; ConveyorTile result = pointsLayer.getTile(tile); CacheResult cacheResult = result.getCacheResult(); assertEquals(CacheResult.MISS, cacheResult); result = pointsLayer.getTile(tile); cacheResult = result.getCacheResult(); assertEquals(CacheResult.HIT, cacheResult); geogigData.update("points/p1", "geom", "POINT(-1 -1)")// .add()// .commit("moved POINT(1 1) to POINT(-1 -1)")// .update("lines/l1", "geom", "LINESTRING(0 10, 0 -10)")// .add()// .commit("moved LINESTRING(-10 0, 10 0) to LINESTRING(0 10, 0 -10)"); // give the hook some time to run Thread.sleep(100); result = pointsLayer.getTile(tile); cacheResult = result.getCacheResult(); assertEquals(CacheResult.MISS, cacheResult); } public ConveyorTile createTileProto(GeoServerTileLayer tileLayer) { MockHttpServletRequest req = new MockHttpServletRequest(); MockHttpServletResponse resp = new MockHttpServletResponse(); String layerName = tileLayer.getName(); MimeType mimeType = tileLayer.getDefaultMimeType(); String gridsetId = tileLayer.getGridSubsets().iterator().next(); Map<String, String> filteringParameters = null; long[] tileIndex = new long[3]; ConveyorTile tile = new ConveyorTile(storageBroker, layerName, gridsetId, tileIndex, mimeType, filteringParameters, req, resp); return tile; } }