/* (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.geoserver.cluster.impl.handlers.configuration; import org.geoserver.catalog.WorkspaceInfo; import org.geoserver.catalog.impl.ModificationProxy; import org.geoserver.catalog.impl.WorkspaceInfoImpl; import org.geoserver.cluster.impl.events.configuration.JMSEventType; import org.geoserver.cluster.impl.events.configuration.JMSServiceModifyEvent; import org.geoserver.config.ServiceInfo; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.test.GeoServerSystemTestSupport; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.Collection; import java.util.Collections; import java.util.List; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.assertThat; public class JmsServiceHandlerTest extends GeoServerSystemTestSupport { @Override protected void setUpSpring(List<String> springContextLocations) { super.setUpSpring(springContextLocations); springContextLocations.add("classpath:TestContext.xml"); } @Before public void setup() { // create a test workspace WorkspaceInfoImpl workspace = new WorkspaceInfoImpl(); workspace.setId("jms-test-workspace"); workspace.setName("jms-test-workspace"); getCatalog().add(workspace); } @After public void clean() { // remove test workspace getCatalog().remove(getCatalog().getWorkspace("jms-test-workspace")); // remove any created service Collection<? extends ServiceInfo> services = getGeoServer().getServices(); for (ServiceInfo service : services) { ServiceInfo finalService = ModificationProxy.unwrap(service); if (finalService instanceof JmsTestServiceInfoImpl) { getGeoServer().remove(finalService); } } } @Test public void testGlobalServiceSimpleCrud() throws Exception { // service events handler JMSServiceHandler handler = createHandler(); // create a new global service handler.synchronize(createNewServiceEvent("jms-test-service-1", "jms-test-service", "global-jms-test-service", null)); checkServiceExists("jms-test-service", "global-jms-test-service", null); // update global service handler.synchronize(createModifyServiceEvent("jms-test-service", "global-jms-test-service-updated", null)); checkServiceExists("jms-test-service", "global-jms-test-service-updated", null); // delete global service handler.synchronize(createRemoveServiceEvent("jms-test-service", null)); assertThat(findService("jms-test-service", null), nullValue()); } @Test public void testVirtualServiceSimpleCrud() throws Exception { // service events handler JMSServiceHandler handler = createHandler(); // create a new virtual service handler.synchronize(createNewServiceEvent("jms-test-service-2", "jms-test-service", "virtual-jms-test-service", "jms-test-workspace")); checkServiceExists("jms-test-service", "virtual-jms-test-service", "jms-test-workspace"); // update virtual service handler.synchronize(createModifyServiceEvent("jms-test-service", "virtual-jms-test-service-updated", "jms-test-workspace")); checkServiceExists("jms-test-service", "virtual-jms-test-service-updated", "jms-test-workspace"); // delete virtual service handler.synchronize(createRemoveServiceEvent("jms-test-service", "jms-test-workspace")); assertThat(findService("jms-test-service", "jms-test-workspace"), nullValue()); } @Test public void testGlobalAndVirtualServiceSimpleCrud() throws Exception { // service events handler JMSServiceHandler handler = createHandler(); // create a new global and virtual service handler.synchronize(createNewServiceEvent("jms-test-service-1", "jms-test-service", "global-jms-test-service", null)); checkServiceExists("jms-test-service", "global-jms-test-service", null); handler.synchronize(createNewServiceEvent("jms-test-service-2", "jms-test-service", "virtual-jms-test-service", "jms-test-workspace")); checkServiceExists("jms-test-service", "virtual-jms-test-service", "jms-test-workspace"); // update global service handler.synchronize(createModifyServiceEvent("jms-test-service", "global-jms-test-service-updated", null)); checkServiceExists("jms-test-service", "global-jms-test-service-updated", null); checkServiceExists("jms-test-service", "virtual-jms-test-service", "jms-test-workspace"); // update virtual service handler.synchronize(createModifyServiceEvent("jms-test-service", "virtual-jms-test-service-updated", "jms-test-workspace")); checkServiceExists("jms-test-service", "virtual-jms-test-service-updated", "jms-test-workspace"); checkServiceExists("jms-test-service", "global-jms-test-service-updated", null); // delete virtual service handler.synchronize(createRemoveServiceEvent("jms-test-service", "jms-test-workspace")); assertThat(findService("jms-test-service", "jms-test-workspace"), nullValue()); assertThat(findService("jms-test-service", null), notNullValue()); // delete global service handler.synchronize(createRemoveServiceEvent("jms-test-service", null)); assertThat(findService("jms-test-service", null), nullValue()); } @Test public void testUpdatingNonExistingVirtualService() throws Exception { // service events handler JMSServiceHandler handler = createHandler(); // create a new global and virtual service handler.synchronize(createNewServiceEvent("jms-test-service-3", "jms-test-service", "global-jms-test-service", null)); checkServiceExists("jms-test-service", "global-jms-test-service", null); handler.synchronize(createNewServiceEvent("jms-test-service-4", "jms-test-service", "virtual-jms-test-service", "jms-test-workspace")); checkServiceExists("jms-test-service", "virtual-jms-test-service", "jms-test-workspace"); // create update virtual service event handler.synchronize(createModifyServiceEvent("jms-test-service", "virtual-jms-test-service-updated", "jms-test-workspace")); // remove virtual service handler.synchronize(createRemoveServiceEvent("jms-test-service", "jms-test-workspace")); assertThat(findService("jms-test-service", "jms-test-workspace"), nullValue()); // check the update result checkServiceExists("jms-test-service", "global-jms-test-service", null); } private void checkServiceExists(String serviceName, String serviceAbstract, String workspaceName) { ServiceInfo serviceInfo = findService(serviceName, workspaceName); assertThat(serviceInfo, notNullValue()); assertThat(serviceInfo.getAbstract(), is(serviceAbstract)); } private JMSServiceModifyEvent createNewServiceEvent(String serviceId, String serviceName, String serviceAbstract, String workspaceName) { // our virtual service information JmsTestServiceInfoImpl serviceInfo = new JmsTestServiceInfoImpl(); serviceInfo.setName(serviceName); serviceInfo.setId(serviceId); if (workspaceName != null) { // this is a virtual service serviceInfo.setWorkspace(getCatalog().getWorkspace(workspaceName)); } serviceInfo.setAbstract(serviceAbstract); // create jms service modify event return new JMSServiceModifyEvent(serviceInfo, JMSEventType.ADDED); } private JMSServiceModifyEvent createModifyServiceEvent(String serviceName, String newServiceAbstract, String workspaceName) { // service information ServiceInfo serviceInfo = findService(serviceName, workspaceName); String oldServiceAbstract = serviceInfo.getAbstract(); serviceInfo.setAbstract(newServiceAbstract); // create jms service modify event return new JMSServiceModifyEvent(serviceInfo, Collections.singletonList("abstract"), Collections.singletonList(oldServiceAbstract), Collections.singletonList(newServiceAbstract), JMSEventType.MODIFIED); } private JMSServiceModifyEvent createRemoveServiceEvent(String serviceName, String workspaceName) { // our virtual service information ServiceInfo serviceInfo = findService(serviceName, workspaceName); // create jms service modify event return new JMSServiceModifyEvent(serviceInfo, JMSEventType.REMOVED); } private ServiceInfo findService(String serviceName, String workspaceName) { if (workspaceName == null) { // global service return ModificationProxy.unwrap(getGeoServer().getServiceByName(serviceName, ServiceInfo.class)); } // virtual service WorkspaceInfo workspaceInfo = getCatalog().getWorkspace(workspaceName); return ModificationProxy.unwrap(getGeoServer().getServiceByName(workspaceInfo, serviceName, ServiceInfo.class)); } private JMSServiceHandler createHandler() { JMSServiceHandlerSPI handlerSpi = GeoServerExtensions.bean(JMSServiceHandlerSPI.class); return (JMSServiceHandler) handlerSpi.createHandler(); } }