/* (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; import static com.google.common.collect.Sets.newHashSet; 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.IOException; import java.util.ArrayList; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.util.tester.FormTester; import org.apache.wicket.util.tester.Result; import org.geoserver.catalog.PublishedType; import org.geoserver.gwc.ConfigurableLockProvider; import org.geoserver.gwc.GWC; import org.geoserver.gwc.config.GWCConfig; import org.geoserver.web.GeoServerHomePage; import org.geoserver.web.GeoServerWicketTestSupport; import org.geowebcache.locks.MemoryLockProvider; import org.geowebcache.locks.NIOLockProvider; import org.geowebcache.storage.blobstore.memory.CacheConfiguration; import org.geowebcache.storage.blobstore.memory.guava.GuavaCacheProvider; import org.junit.Before; import org.junit.Test; public class GWCSettingsPageTest extends GeoServerWicketTestSupport { @Test public void testPageLoad() { GWCSettingsPage page = new GWCSettingsPage(); tester.startPage(page); tester.assertRenderedPage(GWCSettingsPage.class); // print(page, true, true); } @Before public void cleanup() throws IOException { GWC gwc = GWC.get(); GWCConfig config = gwc.getConfig(); config.setLockProviderName(null); gwc.saveConfig(config); } @Test public void testEditDirectWMSIntegration() { GWC gwc = GWC.get(); boolean directWMSIntegrationEnabled = gwc.getConfig().isDirectWMSIntegrationEnabled(); testEditCheckboxOption("form:gwcServicesPanel:enableWMSIntegration", "gwcServicesPanel:enableWMSIntegration", directWMSIntegrationEnabled); assertEquals(!directWMSIntegrationEnabled, gwc.getConfig().isDirectWMSIntegrationEnabled()); } @Test public void testEditEnableWMSC() { GWC gwc = GWC.get(); boolean enabled = gwc.getConfig().isWMSCEnabled(); testEditCheckboxOption("form:gwcServicesPanel:enableWMSC", "gwcServicesPanel:enableWMSC", enabled); assertEquals(!enabled, gwc.getConfig().isWMSCEnabled()); } @Test public void testEnableCacheLayersByDefault() throws Exception { GWC gwc = GWC.get(); GWCConfig config = gwc.getConfig(); config.setCacheLayersByDefault(false); gwc.saveConfig(config); assertFalse(gwc.getConfig().isCacheLayersByDefault()); testEditCheckboxOption("form:cachingOptionsPanel:cacheLayersByDefault", "cachingOptionsPanel:cacheLayersByDefault", false); assertTrue(gwc.getConfig().isCacheLayersByDefault()); } @Test public void testDisableCacheLayersByDefault() throws Exception { GWC gwc = GWC.get(); GWCConfig config = gwc.getConfig(); config.setCacheLayersByDefault(true); gwc.saveConfig(config); assertTrue(gwc.getConfig().isCacheLayersByDefault()); testEditCheckboxOption("form:cachingOptionsPanel:cacheLayersByDefault", "cachingOptionsPanel:cacheLayersByDefault", true); assertFalse(gwc.getConfig().isCacheLayersByDefault()); } @Test public void testEnableAutoCacheStyles() throws Exception { GWC gwc = GWC.get(); GWCConfig config = gwc.getConfig(); config.setCacheLayersByDefault(true); config.setCacheNonDefaultStyles(false); gwc.saveConfig(config); assertFalse(gwc.getConfig().isCacheNonDefaultStyles()); testEditCheckboxOption("form:cachingOptionsPanel:container:configs:cacheNonDefaultStyles", "cachingOptionsPanel:container:configs:cacheNonDefaultStyles", false); assertTrue(gwc.getConfig().isCacheNonDefaultStyles()); } @Test public void testDisableAutoCacheStyles() throws Exception { GWC gwc = GWC.get(); GWCConfig config = gwc.getConfig(); config.setCacheLayersByDefault(true); config.setCacheNonDefaultStyles(true); gwc.saveConfig(config); assertTrue(gwc.getConfig().isCacheNonDefaultStyles()); testEditCheckboxOption("form:cachingOptionsPanel:container:configs:cacheNonDefaultStyles", "cachingOptionsPanel:container:configs:cacheNonDefaultStyles", true); assertFalse(gwc.getConfig().isCacheNonDefaultStyles()); } @Test public void testSetDefaultCacheFormats() throws Exception { GWC gwc = GWC.get(); GWCConfig config = gwc.getConfig(); config.setCacheLayersByDefault(true); gwc.saveConfig(config); GWCSettingsPage page = new GWCSettingsPage(); tester.startPage(page); // print(page, true, true); tester.assertRenderedPage(GWCSettingsPage.class); final List<String> vectorFormats = new ArrayList<>(GWC.getAdvertisedCachedFormats(PublishedType.VECTOR)); final List<String> rasterFormats = new ArrayList<>(GWC.getAdvertisedCachedFormats(PublishedType.RASTER)); final List<String> groupFormats = new ArrayList<>(GWC.getAdvertisedCachedFormats(PublishedType.GROUP)); tester.assertListView( "form:cachingOptionsPanel:container:configs:vectorFormatsGroup:vectorFromats", vectorFormats); tester.assertListView( "form:cachingOptionsPanel:container:configs:rasterFormatsGroup:rasterFromats", rasterFormats); tester.assertListView( "form:cachingOptionsPanel:container:configs:otherFormatsGroup:otherFromats", groupFormats); FormTester form = tester.newFormTester("form"); final boolean replace = true;// tell selectMultiple to first set all options to false form.selectMultiple("cachingOptionsPanel:container:configs:vectorFormatsGroup", new int[] { 1, 3 }, replace); form.selectMultiple("cachingOptionsPanel:container:configs:rasterFormatsGroup", new int[] { 1, 3 }, replace); form.selectMultiple("cachingOptionsPanel:container:configs:otherFormatsGroup", new int[] { 1, 3 }, replace); // print(page, true, true); form.submit("submit"); tester.assertRenderedPage(GeoServerHomePage.class); assertEquals(newHashSet(vectorFormats.get(1), vectorFormats.get(3)), gwc.getConfig() .getDefaultVectorCacheFormats()); assertEquals(newHashSet(rasterFormats.get(1), rasterFormats.get(3)), gwc.getConfig() .getDefaultCoverageCacheFormats()); assertEquals(newHashSet(groupFormats.get(1), groupFormats.get(3)), gwc.getConfig() .getDefaultOtherCacheFormats()); } private void testEditCheckboxOption(final String pagePath, final String formPath, final Boolean initialValue) { GWCSettingsPage page = new GWCSettingsPage(); tester.startPage(page); // print(page, true, true); tester.assertRenderedPage(GWCSettingsPage.class); assertNotNull(pagePath, tester.getComponentFromLastRenderedPage(pagePath)); tester.assertModelValue(pagePath, initialValue); FormTester form = tester.newFormTester("form"); form.setValue(formPath, !initialValue.booleanValue()); form.submit("submit"); tester.assertRenderedPage(GeoServerHomePage.class); } @SuppressWarnings("unchecked") @Test public void testEditLockProvider() { GWC gwc = GWC.get(); ConfigurableLockProvider lockProvider = (ConfigurableLockProvider) gwc.getLockProvider(); assertTrue(lockProvider.getDelegate() instanceof MemoryLockProvider); GWCSettingsPage page = new GWCSettingsPage(); tester.startPage(page); tester.assertRenderedPage(GWCSettingsPage.class); // determine in a future proof way which item contains nioLock DropDownChoice<String> lockDropDown = (DropDownChoice<String>) tester.getComponentFromLastRenderedPage("form:cachingOptionsPanel:container:configs:lockProvider"); List<String> choices = (List<String>) lockDropDown.getChoices(); int nioLockIndex = -1; for (int i = 0; i < choices.size(); i++) { if("nioLock".equals(choices.get(i))) { nioLockIndex = i; break; } } assertTrue(nioLockIndex >= 0); FormTester form = tester.newFormTester("form"); form.select("cachingOptionsPanel:container:configs:lockProvider", nioLockIndex); form.submit("submit"); tester.assertNoErrorMessage(); // check the lock provider has been changed lockProvider = (ConfigurableLockProvider) gwc.getLockProvider(); assertTrue(lockProvider.getDelegate() instanceof NIOLockProvider); } @SuppressWarnings("unchecked") @Test public void testNewDefaultGridSet() throws IOException { GWC gwc = GWC.get(); GWCConfig config = gwc.getConfig(); config.setCacheLayersByDefault(true); gwc.saveConfig(config); // Creation of a new page to test GWCSettingsPage page = new GWCSettingsPage(); // Start the page tester.startPage(page); // Ensure the page is correctly rendered tester.assertRenderedPage(GWCSettingsPage.class); // Ensure the component cachedGridsets belongs to the DefaultGridsetsEditor class tester.assertComponent("form:cachingOptionsPanel:container:configs:cachedGridsets", DefaultGridsetsEditor.class); // Get the available GridSets DropDownChoice<String> availableItems = (DropDownChoice<String>) tester .getComponentFromLastRenderedPage("form:cachingOptionsPanel:container:configs:cachedGridsets:availableGridsets"); // Ensure the component is present assertNotNull(availableItems); // Get the first item String item = availableItems.getChoices().get(0); // Ensure the item is not null assertNotNull(item); // Ensure the item is GlobalCRS84Pixel assertTrue(item.equalsIgnoreCase("GlobalCRS84Pixel")); // Selection of the form tests FormTester form = tester.newFormTester("form", false); form.select("cachingOptionsPanel:container:configs:cachedGridsets:availableGridsets", 0); tester.executeAjaxEvent( "form:cachingOptionsPanel:container:configs:cachedGridsets:addGridset", "click"); // Check that the page is correctly rendered tester.assertRenderedPage(GWCSettingsPage.class); // Save the changes form = tester.newFormTester("form", false); form.select("cachingOptionsPanel:container:configs:cachedGridsets:availableGridsets", 0); form.submit("submit"); // Check no exception has been thrown tester.assertNoErrorMessage(); // Restart the page tester.startPage(page); // Ensure the page is correctly rendered tester.assertRenderedPage(GWCSettingsPage.class); // Get the list of available elements availableItems = (DropDownChoice<String>) tester .getComponentFromLastRenderedPage("form:cachingOptionsPanel:container:configs:cachedGridsets:availableGridsets"); // Ensure that the one used above is no more present assertFalse(availableItems.getChoices().contains(item)); } @Test public void testEnableDisableInnerCaching() throws Exception { GWC gwc = GWC.get(); GWCConfig config = gwc.getConfig(); // Creation of a new page to test GWCSettingsPage page = new GWCSettingsPage(); // Start the page tester.startPage(page); // Ensure the page is correctly rendered tester.assertRenderedPage(GWCSettingsPage.class); // Ensure the component blobstores belongs to the BlobStorePanel class tester.assertComponent("form:cachingOptionsPanel:container:configs:blobstores", InMemoryBlobStorePanel.class); // Selection of the form tests FormTester form = tester.newFormTester("form"); form.setValue("cachingOptionsPanel:container:configs:blobstores:innerCachingEnabled", true); // Check that the page is correctly rendered tester.assertRenderedPage(GWCSettingsPage.class); // Save the changes form.submit("submit"); // Check no exception has been thrown tester.assertNoErrorMessage(); // Check the GWCConfig config = gwc.getConfig(); assertTrue(config.isInnerCachingEnabled()); // Start the page tester.startPage(new GWCSettingsPage()); // Ensure the page is correctly rendered tester.assertRenderedPage(GWCSettingsPage.class); // Check if the Cache Provider is GuavaCacheProvider tester.assertComponent("form:cachingOptionsPanel:container:configs:blobstores:container:caches", DropDownChoice.class); @SuppressWarnings("unchecked") DropDownChoice<String> choice = (DropDownChoice<String>) tester.getComponentFromLastRenderedPage("form:cachingOptionsPanel:container:configs:blobstores:container:caches"); assertTrue(choice.getChoices().get(0).equalsIgnoreCase(GuavaCacheProvider.class.toString())); // Ensure that the other fields are enabled Component comp1 = tester.getComponentFromLastRenderedPage("form:cachingOptionsPanel:container:configs:blobstores:container:cacheConfContainer:hardMemoryLimit"); Component comp2 = tester.getComponentFromLastRenderedPage("form:cachingOptionsPanel:container:configs:blobstores:container:cacheConfContainer:concurrencyLevel"); assertTrue(comp1.isEnabled()); assertTrue(comp2.isEnabled()); // Selection of the form tests form = tester.newFormTester("form"); form.setValue("cachingOptionsPanel:container:configs:blobstores:container:persistenceEnabled", true); form.setValue("cachingOptionsPanel:container:configs:blobstores:container:cacheConfContainer:hardMemoryLimit", 1 + ""); form.setValue("cachingOptionsPanel:container:configs:blobstores:container:cacheConfContainer:concurrencyLevel", 1 + ""); // Check that the page is correctly rendered tester.assertRenderedPage(GWCSettingsPage.class); // Save the changes form.submit("submit"); // Check no exception has been thrown tester.assertNoErrorMessage(); // Check the GWCConfig config = gwc.getConfig(); assertTrue(config.isPersistenceEnabled()); assertEquals(config.getCacheConfigurations().get(GuavaCacheProvider.class.toString()).getConcurrencyLevel(), 1); assertEquals(config.getCacheConfigurations().get(GuavaCacheProvider.class.toString()).getHardMemoryLimit(), 1); // Start the page tester.startPage(new GWCSettingsPage()); // Ensure the page is correctly rendered tester.assertRenderedPage(GWCSettingsPage.class); // Selection of the form tests form = tester.newFormTester("form"); form.setValue("cachingOptionsPanel:container:configs:blobstores:innerCachingEnabled", false); // Save the changes form.submit("submit"); // Start the page tester.startPage(new GWCSettingsPage()); // Ensure the page is correctly rendered tester.assertRenderedPage(GWCSettingsPage.class); Result res = tester.isVisible("form:cachingOptionsPanel:container:configs:blobstores:container:persistenceEnabled"); assertTrue(res.wasFailed()); // Check the GWCConfig config = gwc.getConfig(); assertFalse(config.isInnerCachingEnabled()); } @SuppressWarnings("unchecked") @Test public void testEvictionPolicy() { // creating a start the gwc configuration page GWCSettingsPage page = new GWCSettingsPage(); tester.startPage(page); // enabling the cache FormTester form = tester.newFormTester("form"); form.setValue("cachingOptionsPanel:container:configs:blobstores:innerCachingEnabled", true); form.submit("submit"); tester.startPage(new GWCSettingsPage()); // check that the cache provider is guava tester.assertComponent("form:cachingOptionsPanel:container:configs:blobstores:container:caches", DropDownChoice.class); DropDownChoice<String> choice = (DropDownChoice<String>) tester.getComponentFromLastRenderedPage( "form:cachingOptionsPanel:container:configs:blobstores:container:caches"); assertTrue(choice.getChoices().get(0).equalsIgnoreCase(GuavaCacheProvider.class.toString())); // check that only guava supported eviction policies are available DropDownChoice<String> evictionPoliciesDropDown = (DropDownChoice<String>) tester.getComponentFromLastRenderedPage( "form:cachingOptionsPanel:container:configs:blobstores:container:cacheConfContainer:policy"); List evictionPolicies = evictionPoliciesDropDown.getChoices(); assertTrue(evictionPolicies.size() == 3); assertTrue(evictionPolicies.contains(CacheConfiguration.EvictionPolicy.NULL)); assertTrue(evictionPolicies.contains(CacheConfiguration.EvictionPolicy.EXPIRE_AFTER_ACCESS)); assertTrue(evictionPolicies.contains(CacheConfiguration.EvictionPolicy.EXPIRE_AFTER_WRITE)); } }