/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2014 Boundless * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.cluster.hazelcast; import static org.junit.Assert.*; import static org.easymock.EasyMock.*; import static org.geoserver.cluster.ConfigChangeEventMatcher.configChangeEvent; import static org.hamcrest.CoreMatchers.*; import java.util.Arrays; import org.easymock.IExpectationSetters; import org.geoserver.catalog.DataStoreInfo; import org.geoserver.catalog.Info; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.WorkspaceInfo; import org.geoserver.catalog.event.CatalogListener; import org.geoserver.catalog.event.impl.CatalogAddEventImpl; import org.geoserver.catalog.event.impl.CatalogModifyEventImpl; import org.geoserver.catalog.event.impl.CatalogPostModifyEventImpl; import org.geoserver.catalog.event.impl.CatalogRemoveEventImpl; import org.geoserver.cluster.ConfigChangeEvent; import org.geoserver.cluster.ConfigChangeEvent.Type; import org.geoserver.config.ConfigurationListener; import org.geoserver.config.GeoServerInfo; import org.junit.Test; /** * Test that the Synchronizer sends appropriate messages to the shared topic in response to * config/catalog changes. * @author smithkm * */ public abstract class HzSynchronizerSendTest extends HzSynchronizerTest { IExpectationSetters<Object> expectEvent(Object source, String name, String workspace, String id, Class<? extends Info> clazz, ConfigChangeEvent.Type type) { topic.publish(configChangeEvent(localAddress, id, name, workspace, clazz, type)); return expectLastCall(); } @Test public void testDisableLayer() throws Exception { LayerInfo info; final String layerName = "testLayer"; final String layerId = "Layer-TEST"; final String layerWorkspace = null; // LayerInfo doesn't have a workspace property { info = createMock(LayerInfo.class); expect(info.getName()).andStubReturn(layerName); expect(info.getId()).andStubReturn(layerId); expectEvent(localAddress, layerName, layerWorkspace, layerId, LayerInfo.class, Type.MODIFY); } replay(info); { HzSynchronizer sync = getSynchronizer(); // Mock the result of doing this: // info.setEnabled(false); // getCatalog().save(info); CatalogModifyEventImpl preEvent = new CatalogModifyEventImpl(); preEvent.setSource(info); preEvent.setPropertyNames(Arrays.asList("enabled")); preEvent.setOldValues(Arrays.asList("true")); preEvent.setNewValues(Arrays.asList("false")); for(CatalogListener listener: catListenerCapture.getValues()) { listener.handleModifyEvent(preEvent); } CatalogPostModifyEventImpl postEvent = new CatalogPostModifyEventImpl(); postEvent.setSource(info); for(CatalogListener listener: catListenerCapture.getValues()) { listener.handlePostModifyEvent(postEvent); } } waitForSync(); verify(info); } @Test public void testStoreDelete() throws Exception { DataStoreInfo info; WorkspaceInfo wsInfo; final String storeName = "testStore"; final String storeId = "Store-TEST"; final String storeWorkspace = "Workspace-TEST"; { info = createMock(DataStoreInfo.class); wsInfo = createMock(WorkspaceInfo.class); expect(info.getName()).andStubReturn(storeName); expect(info.getId()).andStubReturn(storeId); expect(info.getWorkspace()).andStubReturn(wsInfo); expect(wsInfo.getId()).andStubReturn(storeWorkspace); expectEvent(localAddress, storeName, storeWorkspace, storeId, DataStoreInfo.class, Type.REMOVE); } replay(info, wsInfo); { HzSynchronizer sync = getSynchronizer(); // Mock the result of doing this: // getCatalog().remove(info); CatalogRemoveEventImpl event = new CatalogRemoveEventImpl(); event.setSource(info); for(CatalogListener listener: catListenerCapture.getValues()) { listener.handleRemoveEvent(event); } } waitForSync(); verify(info, wsInfo); } @Test public void testContactChange() throws Exception { GeoServerInfo info; final String globalName = null; final String globalId = "GeoServer-TEST"; final String globalWorkspace = null; { info = createMock(GeoServerInfo.class); expect(info.getId()).andStubReturn(globalId); expectEvent(localAddress, globalName, globalWorkspace, globalId, GeoServerInfo.class, Type.MODIFY); } replay(info); { HzSynchronizer sync = getSynchronizer(); sync.initialize(configWatcher); // Mock the result of doing this: // GeoServerInfo gsInfo = getGeoServer().getGlobal();; // gsInfo.getSettings().getContact().setAddress("42 Test Street"); // getGeoServer().save(gsInfo); for(ConfigurationListener listener: gsListenerCapture.getValues()) { listener.handleGlobalChange(info, Arrays.asList("contact.address"), Arrays.<Object>asList("69 Old Avenue"), Arrays.<Object>asList("42 Test Street")); } for(ConfigurationListener listener: gsListenerCapture.getValues()) { listener.handlePostGlobalChange(info); } } waitForSync(); verify(info); } @Test public void testWorkspaceAdded() throws Exception { WorkspaceInfo info; final String workspaceName = "testWorkspace"; final String workspaceId = "Workspace-TEST"; final String workspaceWorkspace = null; // LayerInfo doesn't have a workspace property { info = createMock(WorkspaceInfo.class); expect(info.getName()).andStubReturn(workspaceName); expect(info.getId()).andStubReturn(workspaceId); expectEvent(localAddress, workspaceName, workspaceWorkspace, workspaceId, WorkspaceInfo.class, Type.ADD); } replay(info); { HzSynchronizer sync = getSynchronizer(); // Mock the result of doing this: // getCatalog().add(info); CatalogAddEventImpl preEvent = new CatalogAddEventImpl(); preEvent.setSource(info); for(CatalogListener listener: catListenerCapture.getValues()) { listener.handleAddEvent(preEvent); } } waitForSync(); verify(info); } }