/* (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.config;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.geoserver.gwc.GWCTestHelpers.mockGroup;
import static org.geoserver.gwc.GWCTestHelpers.mockLayer;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.File;
import java.util.List;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.PublishedType;
import org.geoserver.config.GeoServer;
import org.geoserver.config.GeoServerFacade;
import org.geoserver.gwc.layer.GeoServerTileLayerInfo;
import org.geoserver.gwc.layer.GeoServerTileLayerInfoImpl;
import org.geoserver.gwc.layer.LegacyTileLayerInfoLoader;
import org.geoserver.gwc.layer.TileLayerCatalog;
import org.geoserver.gwc.layer.TileLayerInfoUtil;
import org.geoserver.gwc.wmts.WMTSInfo;
import org.geoserver.gwc.wmts.WMTSInfoImpl;
import org.geoserver.platform.resource.Files;
import org.geoserver.platform.resource.Resource;
import org.geoserver.wms.WMSInfo;
import org.geoserver.wms.WMSInfoImpl;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
public class GWCInitializerTest {
private GWCInitializer initializer;
private GWCConfigPersister configPersister;
private GeoServer geoServer;
private Catalog rawCatalog;
private TileLayerCatalog tileLayerCatalog;
private GeoServerFacade geoServerFacade;
private WMTSInfo wmtsInfo = new WMTSInfoImpl();
@Before
public void setUp() throws Exception {
configPersister = mock(GWCConfigPersister.class);
GWCConfig config = GWCConfig.getOldDefaults();
config.setWMTSEnabled(false);
when(configPersister.getConfig()).thenReturn(config);
rawCatalog = mock(Catalog.class);
tileLayerCatalog = mock(TileLayerCatalog.class);
initializer = new GWCInitializer(configPersister, rawCatalog, tileLayerCatalog);
wmtsInfo.setEnabled(true);
geoServerFacade = mock(GeoServerFacade.class);
when(geoServerFacade.getService(WMTSInfo.class)).thenReturn(wmtsInfo);
geoServer = mock(GeoServer.class);
when(geoServer.getFacade()).thenReturn(geoServerFacade);
}
@Test
public void testInitializeLayersToOldDefaults() throws Exception {
// no gwc-gs.xml exists
when(configPersister.findConfigFile()).thenReturn(null);
// ignore the upgrade of the direct wms integration flag on this test
when(geoServer.getService(eq(WMSInfo.class))).thenReturn(null);
// let the catalog have something to initialize
LayerInfo layer = mockLayer("testLayer", new String[]{}, PublishedType.RASTER);
LayerGroupInfo group = mockGroup("testGroup", layer);
when(rawCatalog.getLayers()).thenReturn(Lists.newArrayList(layer));
when(rawCatalog.getLayerGroups()).thenReturn(Lists.newArrayList(group));
// run layer initialization
initializer.initialize(geoServer);
// make sure default tile layers were created
GWCConfig oldDefaults = GWCConfig.getOldDefaults();
GeoServerTileLayerInfo tileLayer = TileLayerInfoUtil.loadOrCreate(layer, oldDefaults);
GeoServerTileLayerInfo tileLayerGroup = TileLayerInfoUtil.loadOrCreate(group, oldDefaults);
verify(tileLayerCatalog, times(1)).save(eq(tileLayer));
verify(tileLayerCatalog, times(1)).save(eq(tileLayerGroup));
}
@Test
public void testUpgradeDirectWMSIntegrationFlag() throws Exception {
// no gwc-gs.xml exists, so that initialization runs
when(configPersister.findConfigFile()).thenReturn(null);
// no catalog layers for this test
List<LayerInfo> layers = ImmutableList.of();
List<LayerGroupInfo> groups = ImmutableList.of();
when(rawCatalog.getLayers()).thenReturn(layers);
when(rawCatalog.getLayerGroups()).thenReturn(groups);
WMSInfoImpl wmsInfo = new WMSInfoImpl();
// initialize wmsInfo with a value for the old direct wms integration flag
wmsInfo.getMetadata().put(GWCInitializer.WMS_INTEGRATION_ENABLED_KEY, Boolean.TRUE);
// make sure WMSInfo exists
when(geoServer.getService(eq(WMSInfo.class))).thenReturn(wmsInfo);
ArgumentCaptor<GWCConfig> captor = ArgumentCaptor.forClass(GWCConfig.class);
// run layer initialization
initializer.initialize(geoServer);
verify(configPersister, times(3)).save(captor.capture());
assertTrue(captor.getAllValues().get(0).isDirectWMSIntegrationEnabled());
assertFalse(wmsInfo.getMetadata().containsKey(GWCInitializer.WMS_INTEGRATION_ENABLED_KEY));
verify(geoServer).save(same(wmsInfo));
}
@Test
public void testUpgradeFromTileLayerInfosToTileLayerCatalog() throws Exception {
// do have gwc-gs.xml, so it doesn't go through the createDefaultTileLayerInfos path
Resource fakeConfig = Files.asResource(new File("target", "gwc-gs.xml"));
when(configPersister.findConfigFile()).thenReturn(fakeConfig);
GWCConfig defaults = GWCConfig.getOldDefaults();
defaults.setCacheLayersByDefault(true);
when(configPersister.getConfig()).thenReturn(defaults);
// let the catalog have something to initialize
LayerInfo layer = mockLayer("testLayer", new String[]{}, PublishedType.RASTER);
LayerGroupInfo group = mockGroup("testGroup", layer);
when(rawCatalog.getLayers()).thenReturn(Lists.newArrayList(layer));
when(rawCatalog.getLayerGroups()).thenReturn(Lists.newArrayList(group));
GeoServerTileLayerInfoImpl layerInfo = TileLayerInfoUtil.loadOrCreate(layer, defaults);
GeoServerTileLayerInfoImpl groupInfo = TileLayerInfoUtil.loadOrCreate(group, defaults);
LegacyTileLayerInfoLoader.save(layerInfo, layer.getMetadata());
LegacyTileLayerInfoLoader.save(groupInfo, group.getMetadata());
// run layer initialization
initializer.initialize(geoServer);
verify(tileLayerCatalog, times(1)).save(eq(layerInfo));
assertFalse(LegacyTileLayerInfoLoader.hasTileLayerDef(layer.getMetadata()));
verify(rawCatalog, times(1)).save(eq(layer));
verify(tileLayerCatalog, times(1)).save(eq(groupInfo));
assertFalse(LegacyTileLayerInfoLoader.hasTileLayerDef(group.getMetadata()));
verify(rawCatalog, times(1)).save(eq(group));
}
@Test
public void testUpgradeWithWmtsEnablingInfo() throws Exception {
// force configuration initialisation
when(configPersister.findConfigFile()).thenReturn(null);
assertTrue(wmtsInfo.isEnabled());
// run layer initialization
initializer.initialize(geoServer);
// checking that the configuration was saved
verify(geoServer).save(same(wmtsInfo));
verify(configPersister, times(2)).save(configPersister.getConfig());
// checking that the service info have been updated with gwc configuration value
assertFalse(wmtsInfo.isEnabled());
}
}