/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.gwc.web.layer; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.Serializable; import java.util.Arrays; import org.apache.wicket.Component; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.util.tester.FormTester; import org.geoserver.catalog.LayerInfo; import org.geoserver.data.test.MockData; import org.geoserver.gwc.GWC; import org.geoserver.gwc.config.GWCConfig; import org.geoserver.gwc.layer.CatalogConfiguration; import org.geoserver.gwc.layer.GeoServerTileLayer; import org.geoserver.gwc.layer.GeoServerTileLayerInfo; import org.geoserver.gwc.layer.GeoServerTileLayerInfoImpl; import org.geoserver.gwc.layer.TileLayerInfoUtil; import org.geoserver.web.ComponentBuilder; import org.geoserver.web.FormTestPage; import org.geoserver.web.GeoServerWicketTestSupport; import org.geowebcache.layer.TileLayer; import org.junit.Before; import org.junit.Test; public class LayerCacheOptionsTabPanelTest extends GeoServerWicketTestSupport { private IModel<LayerInfo> layerModel; private GeoServerTileLayerInfoModel tileLayerModel; @Before public void setUpInternal() throws Exception { LayerInfo layerInfo = getCatalog().getLayerByName(getLayerId(MockData.BUILDINGS)); assertTrue(CatalogConfiguration.isLayerExposable(layerInfo)); GeoServerTileLayer tileLayer = GWC.get().getTileLayer(layerInfo); assertNotNull(tileLayer); layerModel = new Model<LayerInfo>(layerInfo); tileLayerModel = new GeoServerTileLayerInfoModel(tileLayer.getInfo(), false); } @Test public void testPageLoad() { tester.startPage(new FormTestPage(new ComponentBuilder() { private static final long serialVersionUID = -5907648151984337786L; public Component buildComponent(final String id) { return new LayerCacheOptionsTabPanel(id, layerModel, tileLayerModel); } })); tester.assertComponent("form:panel", LayerCacheOptionsTabPanel.class); tester.assertComponent("form:panel:tileLayerEditor", GeoServerTileLayerEditor.class); // Ensure the InMemoryCaching checkbox is present tester.assertComponent("form:panel:tileLayerEditor:container:configs:inMemoryCached", CheckBox.class); } @Test public void testPageLoadForGeometrylessLayer() { LayerInfo geometryless = getCatalog().getLayerByName( super.getLayerId(MockData.GEOMETRYLESS)); assertFalse(CatalogConfiguration.isLayerExposable(geometryless)); assertNull(GWC.get().getTileLayer(geometryless)); layerModel = new Model<LayerInfo>(geometryless); final GWCConfig saneDefaults = GWC.get().getConfig().saneConfig(); GeoServerTileLayerInfoImpl tileLayerInfo = TileLayerInfoUtil.loadOrCreate(geometryless, saneDefaults); tileLayerModel = new GeoServerTileLayerInfoModel(tileLayerInfo, false); tester.startPage(new FormTestPage(new ComponentBuilder() { private static final long serialVersionUID = -5907648151984337786L; public Component buildComponent(final String id) { return new LayerCacheOptionsTabPanel(id, layerModel, tileLayerModel); } })); tester.assertComponent("form:panel", LayerCacheOptionsTabPanel.class); //Label instead of GeoServerTileLayerEditor tester.assertComponent("form:panel:tileLayerEditor", Label.class); } @Test public void testSaveExisting() { tester.startPage(new FormTestPage(new ComponentBuilder() { private static final long serialVersionUID = -6705646666953650890L; public Component buildComponent(final String id) { return new LayerCacheOptionsTabPanel(id, layerModel, tileLayerModel); } })); tester.assertComponent("form:panel", LayerCacheOptionsTabPanel.class); GeoServerTileLayerInfo info = tileLayerModel.getObject(); info.setEnabled(!info.isEnabled()); LayerCacheOptionsTabPanel panel = (LayerCacheOptionsTabPanel) tester .getComponentFromLastRenderedPage("form:panel"); panel.save(); TileLayer tileLayer = GWC.get().getTileLayerByName(info.getName()); GeoServerTileLayerInfo actual = ((GeoServerTileLayer) tileLayer).getInfo(); assertEquals(info.isEnabled(), actual.isEnabled()); } @Test public void testSaveNew() { GWC mediator = GWC.get(); mediator.removeTileLayers(Arrays.asList(tileLayerModel.getObject().getName())); assertNull(mediator.getTileLayer(layerModel.getObject())); GeoServerTileLayerInfo newInfo = TileLayerInfoUtil.loadOrCreate(layerModel.getObject(), mediator.getConfig()); tileLayerModel = new GeoServerTileLayerInfoModel(newInfo, true); tester.startPage(new FormTestPage(new ComponentBuilder() { private static final long serialVersionUID = -6705646666953650890L; public Component buildComponent(final String id) { return new LayerCacheOptionsTabPanel(id, layerModel, tileLayerModel); } })); tester.assertComponent("form:panel", LayerCacheOptionsTabPanel.class); LayerCacheOptionsTabPanel panel = (LayerCacheOptionsTabPanel) tester .getComponentFromLastRenderedPage("form:panel"); panel.save(); // Ensure the GeoServerTileLayerInfoModel is updated assertNotNull(tileLayerModel.getEnabled()); assertTrue(tileLayerModel.getEnabled().booleanValue()); assertNotNull(mediator.getTileLayer(layerModel.getObject())); } @Test public void testDontSaveNew() throws IOException { // Method for testing that if the createTileLayer checkbox is disabled, no TileLayer is configured GWC mediator = GWC.get(); // Save the old GeoServerTileLayer GeoServerTileLayer tileLayer = (GeoServerTileLayer) mediator .getTileLayerByName(tileLayerModel.getObject().getName()); // Remove the tileLayer mediator.removeTileLayers(Arrays.asList(tileLayerModel.getObject().getName())); assertNull(mediator.getTileLayer(layerModel.getObject())); // Update the configuration in order to set default caching GWCConfig config = mediator.getConfig(); boolean defaultCaching = config.isCacheLayersByDefault(); config.setCacheLayersByDefault(true); mediator.saveConfig(config); // Create the new Layer GeoServerTileLayerInfo newInfo = TileLayerInfoUtil.loadOrCreate(layerModel.getObject(), mediator.getConfig()); tileLayerModel = new GeoServerTileLayerInfoModel(newInfo, true); tester.startPage(new FormTestPage(new ComponentBuilder() { private static final long serialVersionUID = -6705646666953650890L; public Component buildComponent(final String id) { return new LayerCacheOptionsTabPanel(id, layerModel, tileLayerModel); } })); tester.assertComponent("form:panel", LayerCacheOptionsTabPanel.class); tester.isVisible("form:panel:tileLayerEditor:container:configs"); // Avoid saving the Layer FormTester formTester = tester.newFormTester("form"); formTester.setValue("panel:tileLayerEditor:createTileLayer", false); tester.executeAjaxEvent("form:panel:tileLayerEditor:createTileLayer", "change"); tester.isInvisible("form:panel:tileLayerEditor:container:configs"); LayerCacheOptionsTabPanel panel = (LayerCacheOptionsTabPanel) tester .getComponentFromLastRenderedPage("form:panel"); formTester.getForm().onFormSubmitted(); // This is an utter hack but is the only way I could // figure out to exercise the validators the same // way that happens in a live GeoServer panel.save(); // Ensure the GeoServerTileLayerInfoModel is updated assertNotNull(tileLayerModel.getEnabled()); assertFalse(tileLayerModel.getEnabled().booleanValue()); assertNull(mediator.getTileLayer(layerModel.getObject())); // Back to the default configuration config.setCacheLayersByDefault(defaultCaching); mediator.saveConfig(config); // Save the initial Layer again for other tests mediator.add(tileLayer); } @Test public void testRemoveExisting() { LayerInfo layerInfo = getCatalog().getLayerByName(getLayerId(MockData.LAKES)); GeoServerTileLayer tileLayer = GWC.get().getTileLayer(layerInfo); assertNotNull(tileLayer); layerModel = new Model<LayerInfo>(layerInfo); tileLayerModel = new GeoServerTileLayerInfoModel(tileLayer.getInfo(), false); GWC mediator = GWC.get(); assertNotNull(mediator.getTileLayer(layerModel.getObject())); tester.startPage(new FormTestPage(new ComponentBuilder() { private static final long serialVersionUID = -6705646666953650890L; public Component buildComponent(final String id) { return new LayerCacheOptionsTabPanel(id, layerModel, tileLayerModel); } })); tester.assertComponent("form:panel", LayerCacheOptionsTabPanel.class); // mimic what the editor does to remove a tile layer associated with a layer info // print(tester.getComponentFromLastRenderedPage("form:panel"), true, true); FormTester formTester = tester.newFormTester("form"); formTester.setValue("panel:tileLayerEditor:createTileLayer", false); formTester.submit(); LayerCacheOptionsTabPanel panel = (LayerCacheOptionsTabPanel) tester .getComponentFromLastRenderedPage("form:panel"); panel.save(); assertNull(mediator.getTileLayer(layerModel.getObject())); } @Test public void testAddNullFilter() { // Create a form page for the LayerCacheOptionsTabPanel component FormTestPage page = new FormTestPage(new ComponentBuilder() { private static final long serialVersionUID = -5907648151984337786L; public Component buildComponent(final String id) { return new LayerCacheOptionsTabPanel(id, layerModel, tileLayerModel); } }); // Start the page tester.startPage(page); // Ensure the GeoServerTileLayerEditor is rendered tester.assertComponent("form:panel:tileLayerEditor", GeoServerTileLayerEditor.class); // Click on the addFilter button withou setting any filter tester.executeAjaxEvent( "form:panel:tileLayerEditor:container:configs:parameterFilters:addFilter", "click"); // Ensure that the Component is rendered again tester.assertComponent("form:panel:tileLayerEditor", GeoServerTileLayerEditor.class); // Ensure that an Error message has been thrown tester.assertErrorMessages((Serializable[]) new String[] { "Filter should not be empty" }); // Create new form tester for the final submit FormTester form = tester.newFormTester("form"); // Save the changes form.submit(); // Check no exception has been thrown tester.assertNoErrorMessage(); } }