From db066287b0e1aac99ebdb9eb7a59cc749c3d2d61 Mon Sep 17 00:00:00 2001 From: John Blum Date: Mon, 7 Jul 2014 18:25:33 -0700 Subject: [PATCH] Completes JIRA improvement SGF-294 allowing GemFire Gateway Receivers to be configured for manual start using the Spring Data GemFire XML namespace. This commit completes the improvement in the 1.4 XSD first in order to backport the feature to the SDG 1.4.2 release. --- .../gemfire/config/GatewayReceiverParser.java | 18 ++- .../gemfire/config/GatewaySenderParser.java | 42 +++--- .../wan/AbstractWANComponentFactoryBean.java | 54 +++---- .../wan/GatewayReceiverFactoryBean.java | 110 ++++++++++---- .../gemfire/wan/GatewaySenderFactoryBean.java | 64 ++++---- .../gemfire/wan/GatewaySenderWrapper.java | 26 +++- .../gemfire/config/spring-gemfire-1.4.xsd | 139 +++++++++--------- .../config/GatewayReceiverNamespaceTest.java | 84 +++++++++++ .../test/StubGatewayReceiverFactory.java | 15 +- ...alGatewayReceiverStartIntegrationTest.java | 94 ++++++++++++ .../GatewayReceiverNamespaceTest-context.xml | 19 +++ ...ayReceiverStartIntegrationTest-context.xml | 25 ++++ 12 files changed, 499 insertions(+), 191 deletions(-) create mode 100644 src/test/java/org/springframework/data/gemfire/config/GatewayReceiverNamespaceTest.java create mode 100644 src/test/java/org/springframework/data/gemfire/wan/ManualGatewayReceiverStartIntegrationTest.java create mode 100644 src/test/resources/org/springframework/data/gemfire/config/GatewayReceiverNamespaceTest-context.xml create mode 100644 src/test/resources/org/springframework/data/gemfire/wan/ManualGatewayReceiverStartIntegrationTest-context.xml diff --git a/src/main/java/org/springframework/data/gemfire/config/GatewayReceiverParser.java b/src/main/java/org/springframework/data/gemfire/config/GatewayReceiverParser.java index 2170a99a..085990c3 100644 --- a/src/main/java/org/springframework/data/gemfire/config/GatewayReceiverParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/GatewayReceiverParser.java @@ -24,9 +24,11 @@ import org.w3c.dom.Element; /** * @author David Turanski - * + * @author John Blum + * @see org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser */ class GatewayReceiverParser extends AbstractSimpleBeanDefinitionParser { + @Override protected Class getBeanClass(Element element) { return GatewayReceiverFactoryBean.class; @@ -34,15 +36,19 @@ class GatewayReceiverParser extends AbstractSimpleBeanDefinitionParser { @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - builder.setLazyInit(false); String cacheRef = element.getAttribute("cache-ref"); - // add cache reference (fallback to default if nothing is specified) - builder.addConstructorArgReference((StringUtils.hasText(cacheRef) ? cacheRef : "gemfireCache")); + + builder.addConstructorArgReference((StringUtils.hasText(cacheRef) ? cacheRef + : GemfireConstants.DEFAULT_GEMFIRE_CACHE_NAME)); + builder.setLazyInit(false); + + ParsingUtils.setPropertyValue(element, builder, "bind-address"); ParsingUtils.setPropertyValue(element, builder, "start-port"); ParsingUtils.setPropertyValue(element, builder, "end-port"); - ParsingUtils.setPropertyValue(element, builder, "socket-buffer-size"); + ParsingUtils.setPropertyValue(element, builder, "manual-start"); ParsingUtils.setPropertyValue(element, builder, "maximum-time-between-pings"); - ParsingUtils.setPropertyValue(element, builder, "bind-address"); + ParsingUtils.setPropertyValue(element, builder, "socket-buffer-size"); ParsingUtils.parseTransportFilters(element, parserContext, builder); } + } diff --git a/src/main/java/org/springframework/data/gemfire/config/GatewaySenderParser.java b/src/main/java/org/springframework/data/gemfire/config/GatewaySenderParser.java index 270af601..1c3d1f80 100644 --- a/src/main/java/org/springframework/data/gemfire/config/GatewaySenderParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/GatewaySenderParser.java @@ -25,7 +25,8 @@ import org.w3c.dom.Element; /** * @author David Turanski - * + * @author John Blum + * @see org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser */ class GatewaySenderParser extends AbstractSimpleBeanDefinitionParser { @@ -36,12 +37,12 @@ class GatewaySenderParser extends AbstractSimpleBeanDefinitionParser { @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - String cacheRef = element.getAttribute("cache-ref"); - // add cache reference (fallback to default if nothing is specified) builder.addConstructorArgReference((StringUtils.hasText(cacheRef) ? cacheRef - : GemfireConstants.DEFAULT_GEMFIRE_CACHE_NAME)); + : GemfireConstants.DEFAULT_GEMFIRE_CACHE_NAME)); + + ParsingUtils.setPropertyValue(element, builder, NAME_ATTRIBUTE); ParsingUtils.setPropertyValue(element, builder, "alert-threshold"); ParsingUtils.setPropertyValue(element, builder, "batch-size"); ParsingUtils.setPropertyValue(element, builder, "batch-time-interval"); @@ -52,39 +53,40 @@ class GatewaySenderParser extends AbstractSimpleBeanDefinitionParser { ParsingUtils.setPropertyValue(element, builder, "manual-start"); ParsingUtils.setPropertyValue(element, builder, "maximum-queue-memory"); ParsingUtils.setPropertyValue(element, builder, "order-policy"); + ParsingUtils.setPropertyValue(element, builder, "parallel"); + ParsingUtils.setPropertyValue(element, builder, "persistent"); ParsingUtils.setPropertyValue(element, builder, "remote-distributed-system-id"); ParsingUtils.setPropertyValue(element, builder, "socket-buffer-size"); ParsingUtils.setPropertyValue(element, builder, "socket-read-timeout"); - ParsingUtils.setPropertyValue(element, builder, "persistent"); - ParsingUtils.setPropertyValue(element, builder, "parallel"); - ParsingUtils.setPropertyValue(element, builder, NAME_ATTRIBUTE); Element eventFilterElement = DomUtils.getChildElementByTagName(element, "event-filter"); + if (eventFilterElement != null) { - builder.addPropertyValue("eventFilters", - ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, eventFilterElement, builder)); + builder.addPropertyValue("eventFilters", ParsingUtils.parseRefOrNestedBeanDeclaration( + parserContext, eventFilterElement, builder)); } ParsingUtils.parseTransportFilters(element, parserContext, builder); - /** - * set the name for an inner bean - */ + // set the name for the GatewaySender as an inner bean if (!StringUtils.hasText(element.getAttribute(NAME_ATTRIBUTE))) { if (element.getParentNode().getNodeName().endsWith("region")) { Element region = (Element) element.getParentNode(); - String regionName = StringUtils.hasText(region.getAttribute("name")) ? region.getAttribute("name") - : region.getAttribute("id"); - int i = 0; - String name = regionName + ".gatewaySender#" + i; - while (parserContext.getRegistry().isBeanNameInUse(name)) { - i++; - name = regionName + ".gatewaySender#" + i; + String regionName = (StringUtils.hasText(region.getAttribute(NAME_ATTRIBUTE)) + ? region.getAttribute(NAME_ATTRIBUTE) : region.getAttribute(ID_ATTRIBUTE)); + + int number = 0; + + String gatewaySenderName = (regionName + ".gatewaySender#" + number); + + while (parserContext.getRegistry().isBeanNameInUse(gatewaySenderName)) { + gatewaySenderName = (regionName + ".gatewaySender#" + (++number)); } - builder.addPropertyValue("name", name); + builder.addPropertyValue("name", gatewaySenderName); } } } + } diff --git a/src/main/java/org/springframework/data/gemfire/wan/AbstractWANComponentFactoryBean.java b/src/main/java/org/springframework/data/gemfire/wan/AbstractWANComponentFactoryBean.java index 40ef2d6d..b701aebb 100644 --- a/src/main/java/org/springframework/data/gemfire/wan/AbstractWANComponentFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/wan/AbstractWANComponentFactoryBean.java @@ -27,6 +27,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; import com.gemstone.gemfire.cache.Cache; +import com.gemstone.gemfire.management.internal.cli.util.spring.StringUtils; /** * Base class for GemFire WAN Gateway component factory beans. @@ -34,7 +35,7 @@ import com.gemstone.gemfire.cache.Cache; * @author David Turanski * @author John Blum */ -public abstract class AbstractWANComponentFactoryBean implements FactoryBean, InitializingBean, BeanNameAware, +public abstract class AbstractWANComponentFactoryBean implements BeanNameAware, FactoryBean, InitializingBean, DisposableBean { protected static final List VALID_ORDER_POLICIES = Arrays.asList("KEY", "PARTITION", "THREAD"); @@ -51,34 +52,24 @@ public abstract class AbstractWANComponentFactoryBean implements FactoryBean< protected AbstractWANComponentFactoryBean(final Cache cache) { this.cache = cache; } - - public void setName(String name) { + + @Override + public final void setBeanName(final String beanName) { + this.beanName = beanName; + } + + public void setFactory(Object factory) { + this.factory = factory; + } + + public void setName(final String name) { this.name = name; } public String getName() { - return (name != null ? name: beanName); + return (StringUtils.hasText(name) ? name: beanName); } - @Override - public void destroy() throws Exception { - // TODO Auto-generated method stub - } - - @Override - public final void setBeanName(String beanName) { - this.beanName = beanName; - } - - @Override - public final void afterPropertiesSet() throws Exception { - Assert.notNull(getName(), "Name cannot be null"); - Assert.notNull(cache, "Cache cannot be null"); - doInit(); - } - - protected abstract void doInit() throws Exception; - @Override public abstract T getObject() throws Exception; @@ -89,9 +80,18 @@ public abstract class AbstractWANComponentFactoryBean implements FactoryBean< public final boolean isSingleton() { return true; } - - public void setFactory(Object factory) { - this.factory = factory; + + @Override + public final void afterPropertiesSet() throws Exception { + Assert.notNull(getName(), "Name must not be null."); + Assert.notNull(cache, "Cache must not be null."); + doInit(); } - + + protected abstract void doInit() throws Exception; + + @Override + public void destroy() throws Exception { + } + } diff --git a/src/main/java/org/springframework/data/gemfire/wan/GatewayReceiverFactoryBean.java b/src/main/java/org/springframework/data/gemfire/wan/GatewayReceiverFactoryBean.java index ac39fb6e..0d976a50 100644 --- a/src/main/java/org/springframework/data/gemfire/wan/GatewayReceiverFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/wan/GatewayReceiverFactoryBean.java @@ -15,8 +15,10 @@ */ package org.springframework.data.gemfire.wan; +import java.io.IOException; import java.util.List; +import org.springframework.context.SmartLifecycle; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -29,20 +31,26 @@ import com.gemstone.gemfire.cache.wan.GatewayTransportFilter; * FactoryBean for creating a GemFire {@link GatewayReceiver}. * * @author David Turanski - * + * @author John Blum + * @see org.springframework.data.gemfire.wan.AbstractWANComponentFactoryBean + * @see com.gemstone.gemfire.cache.Cache + * @see com.gemstone.gemfire.cache.wan.GatewayReceiver + * @see com.gemstone.gemfire.cache.wan.GatewayReceiverFactory + * @since 1.2.2 */ -public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean { - private GatewayReceiver gatewayReceiver; +public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean + implements SmartLifecycle { - private List transportFilters; + private boolean manualStart = false; - private Integer startPort; + private volatile GatewayReceiver gatewayReceiver; private Integer endPort; - private Integer maximumTimeBetweenPings; - private Integer socketBufferSize; + private Integer startPort; + + private List transportFilters; private String bindAddress; @@ -63,44 +71,48 @@ public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean< @Override public Class getObjectType() { - return GatewayReceiver.class; + return (gatewayReceiver != null ? gatewayReceiver.getClass() : GatewayReceiver.class); } @Override protected void doInit() throws Exception { GatewayReceiverFactory gatewayReceiverFactory = cache.createGatewayReceiverFactory(); + if (!CollectionUtils.isEmpty(transportFilters)) { for (GatewayTransportFilter transportFilter : transportFilters) { gatewayReceiverFactory.addGatewayTransportFilter(transportFilter); } } - int minPort = (startPort == null) ? GatewayReceiver.DEFAULT_START_PORT : startPort; - int maxPort = (endPort == null) ? GatewayReceiver.DEFAULT_END_PORT : endPort; - Assert.isTrue(minPort <= maxPort, "startPort must be less then or equal to " + maxPort); - gatewayReceiverFactory.setStartPort(minPort); - gatewayReceiverFactory.setEndPort(maxPort); - if (socketBufferSize != null) { - gatewayReceiverFactory.setSocketBufferSize(socketBufferSize); - } - if (maximumTimeBetweenPings != null) { - gatewayReceiverFactory.setMaximumTimeBetweenPings(maximumTimeBetweenPings); - } + if (bindAddress != null) { gatewayReceiverFactory.setBindAddress(bindAddress); } + int minPort = (startPort != null ? startPort : GatewayReceiver.DEFAULT_START_PORT); + int maxPort = (endPort != null ? endPort : GatewayReceiver.DEFAULT_END_PORT); + + Assert.isTrue(minPort <= maxPort, String.format("'startPort' must be less than or equal to %1$d.", maxPort)); + + gatewayReceiverFactory.setStartPort(minPort); + gatewayReceiverFactory.setEndPort(maxPort); + + if (maximumTimeBetweenPings != null) { + gatewayReceiverFactory.setMaximumTimeBetweenPings(maximumTimeBetweenPings); + } + + if (socketBufferSize != null) { + gatewayReceiverFactory.setSocketBufferSize(socketBufferSize); + } + gatewayReceiver = gatewayReceiverFactory.create(); - - gatewayReceiver.start(); - } - public void setGatewayReceiver(GatewayReceiver gatewayReceiver) { + public void setGatewayReceiver(final GatewayReceiver gatewayReceiver) { this.gatewayReceiver = gatewayReceiver; } - public void setTransportFilters(List transportFilters) { - this.transportFilters = transportFilters; + public void setBindAddress(String bindAddress) { + this.bindAddress = bindAddress; } public void setStartPort(Integer startPort) { @@ -111,6 +123,10 @@ public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean< this.endPort = endPort; } + public void setManualStart(Boolean manualStart) { + this.manualStart = Boolean.TRUE.equals(manualStart); + } + public void setMaximumTimeBetweenPings(Integer maximumTimeBetweenPings) { this.maximumTimeBetweenPings = maximumTimeBetweenPings; } @@ -119,8 +135,48 @@ public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean< this.socketBufferSize = socketBufferSize; } - public void setBindAddress(String bindAddress) { - this.bindAddress = bindAddress; + public void setTransportFilters(List transportFilters) { + this.transportFilters = transportFilters; + } + + @Override + public boolean isAutoStartup() { + return !manualStart; + } + + @Override + public int getPhase() { + return Integer.MAX_VALUE; + } + + @Override + public boolean isRunning() { + return gatewayReceiver.isRunning(); + } + + @Override + public void start() { + Assert.state(gatewayReceiver != null, "The GatewayReceiver was not properly configured and initialized!"); + + if (!isRunning()) { + try { + gatewayReceiver.start(); + } + catch (IOException e) { + throw new RuntimeException("Failed to start Gateway Receiver due to I/O error.", e); + } + } + } + + @Override + public void stop() { + gatewayReceiver.stop(); + } + + @Override + public void stop(final Runnable callback) { + stop(); + callback.run(); } } diff --git a/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java b/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java index 6cea311e..e39c463a 100644 --- a/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java @@ -33,6 +33,13 @@ import com.gemstone.gemfire.cache.wan.GatewayTransportFilter; * * @author David Turanski * @author John Blum + * @see org.springframework.context.SmartLifecycle + * @see org.springframework.data.gemfire.wan.AbstractWANComponentFactoryBean + * @see com.gemstone.gemfire.cache.Cache + * @see com.gemstone.gemfire.cache.util.Gateway + * @see com.gemstone.gemfire.cache.wan.GatewaySender + * @see com.gemstone.gemfire.cache.wan.GatewaySenderFactory + * @since 1.2.2 */ @SuppressWarnings("unused") public class GatewaySenderFactoryBean extends AbstractWANComponentFactoryBean @@ -81,7 +88,7 @@ public class GatewaySenderFactoryBean extends AbstractWANComponentFactoryBean getObjectType() { - return GatewaySender.class; + return (gatewaySender != null ? gatewaySender.getClass() : GatewaySender.class); } @Override @@ -159,6 +166,7 @@ public class GatewaySenderFactoryBean extends AbstractWANComponentFactoryBean - + - + - - - - - - - - - - - - - - - @@ -2502,20 +2477,24 @@ The maximum time interval that can elapse before a partial batch is sent from a ]]> - - - - - - + + + + + + + + + + + @@ -2527,6 +2506,20 @@ Specifies the order policy. Order policy only applies if the gateway sender que KEY: Indicates that events will be concurrently processed based on the event's key, PARTITION: Indicates that events will be concurrently processed based on the event's partition (using the PartitionResolver) THREAD: Indicates that events will be concurrently processed based on the event's originating member and thread + ]]> + + + + + + + + + + @@ -2540,23 +2533,14 @@ Specifies the batch size ]]> - - - - - - + - + + + + + + @@ -2587,6 +2578,27 @@ A gateway receiver definition (requires Gemfire 7.0 or later) + + + + + + + + + + + + + + + - + - + - + - - - - - - - - - - diff --git a/src/test/java/org/springframework/data/gemfire/config/GatewayReceiverNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/GatewayReceiverNamespaceTest.java new file mode 100644 index 00000000..9636b71a --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/config/GatewayReceiverNamespaceTest.java @@ -0,0 +1,84 @@ +/* + * Copyright 2010-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.data.gemfire.config; + +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 javax.annotation.Resource; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.data.gemfire.test.GemfireTestApplicationContextInitializer; +import org.springframework.data.gemfire.wan.GatewayReceiverFactoryBean; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.gemstone.gemfire.cache.wan.GatewayReceiver; + +/** + * The GatewayReceiverNamespaceTest class is a test suite of test cases testing the contract and functionality of + * Gateway Receiver configuration in Spring Data GemFire using the XML namespace and schema (XSD). + * + * @author John Blum + * @see org.junit.Test + * @since 1.5.0 + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(initializers = GemfireTestApplicationContextInitializer.class) +@SuppressWarnings("unused") +public class GatewayReceiverNamespaceTest { + + @Resource(name = "&Default") + private GatewayReceiverFactoryBean defaultFactoryBean; + + @Resource(name = "&Auto") + private GatewayReceiverFactoryBean autoGatewayReceiver; + + @Resource(name = "&Manual") + private GatewayReceiverFactoryBean manualGatewayReceiver; + + @Test + public void testDefault() throws Exception { + assertNotNull("The 'Default' GatewayReceiverFactoryBean was not properly configured and initialized!", defaultFactoryBean); + assertTrue(defaultFactoryBean.isAutoStartup()); + + GatewayReceiver defaultGatewayReceiver = defaultFactoryBean.getObject(); + + assertNotNull(defaultGatewayReceiver); + assertEquals("192.168.0.1", defaultGatewayReceiver.getBindAddress()); + assertEquals(12345, defaultGatewayReceiver.getStartPort()); + assertEquals(54321, defaultGatewayReceiver.getEndPort()); + assertEquals(5000, defaultGatewayReceiver.getMaximumTimeBetweenPings()); + assertEquals(32768, defaultGatewayReceiver.getSocketBufferSize()); + } + + @Test + public void testAuto() { + assertNotNull("The 'Auto' GatewayReceiverFactoryBean was not properly configured and initialized!", autoGatewayReceiver); + assertTrue(autoGatewayReceiver.isAutoStartup()); + } + + @Test + public void testManual() { + assertNotNull("The 'Manual' GatewayReceiverFactoryBean was not properly configured and initialized!", manualGatewayReceiver); + assertFalse(manualGatewayReceiver.isAutoStartup()); + } + +} diff --git a/src/test/java/org/springframework/data/gemfire/test/StubGatewayReceiverFactory.java b/src/test/java/org/springframework/data/gemfire/test/StubGatewayReceiverFactory.java index ec3047aa..8c15f4f7 100644 --- a/src/test/java/org/springframework/data/gemfire/test/StubGatewayReceiverFactory.java +++ b/src/test/java/org/springframework/data/gemfire/test/StubGatewayReceiverFactory.java @@ -27,13 +27,15 @@ import com.gemstone.gemfire.cache.wan.GatewayTransportFilter; * */ public class StubGatewayReceiverFactory implements GatewayReceiverFactory { - - private int startPort; + private int endPort; - private String bindAddress; - private List gatewayTransportFilters = new ArrayList(); private int maximumTimeBetweenPings; private int socketBufferSize; + private int startPort; + + private List gatewayTransportFilters = new ArrayList(); + + private String bindAddress; private String hostnameForClients; /* (non-Javadoc) @@ -115,14 +117,15 @@ public class StubGatewayReceiverFactory implements GatewayReceiverFactory { @Override public GatewayReceiver create() { GatewayReceiver gatewayReceiver = mock(GatewayReceiver.class); + when(gatewayReceiver.getBindAddress()).thenReturn(this.bindAddress); when(gatewayReceiver.getEndPort()).thenReturn(this.endPort); when(gatewayReceiver.getGatewayTransportFilters()).thenReturn(this.gatewayTransportFilters); + when(gatewayReceiver.getHost()).thenReturn(this.hostnameForClients); when(gatewayReceiver.getMaximumTimeBetweenPings()).thenReturn(this.maximumTimeBetweenPings); when(gatewayReceiver.getSocketBufferSize()).thenReturn(this.socketBufferSize); when(gatewayReceiver.getStartPort()).thenReturn(this.startPort); - when(gatewayReceiver.getHost()).thenReturn(this.hostnameForClients); - + return gatewayReceiver; } diff --git a/src/test/java/org/springframework/data/gemfire/wan/ManualGatewayReceiverStartIntegrationTest.java b/src/test/java/org/springframework/data/gemfire/wan/ManualGatewayReceiverStartIntegrationTest.java new file mode 100644 index 00000000..31c908fa --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/wan/ManualGatewayReceiverStartIntegrationTest.java @@ -0,0 +1,94 @@ +/* + * Copyright 2010-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.data.gemfire.wan; + +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 javax.annotation.Resource; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.gemstone.gemfire.cache.wan.GatewayReceiver; + +/** + * The ManualGatewayReceiverStartIntegrationTest class is a test suite of test cases testing the manual start capability + * of Gateway Receivers when configured with the Spring Data GemFire XML namespace. + * + * @author John Blum + * @see org.junit.Test + * @see org.junit.runner.RunWith + * @see org.springframework.test.context.ContextConfiguration + * @see org.springframework.test.context.junit4.SpringJUnit4ClassRunner + * @since 1.5.0 + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +@SuppressWarnings("unused") +public class ManualGatewayReceiverStartIntegrationTest { + + @Resource(name = "Auto") + private GatewayReceiver autoGatewayReceiver; + + @Resource(name = "Manual") + private GatewayReceiver manualGatewayReceiver; + + @Test + public void testAutoGatewayReceiver() { + assertNotNull("The 'Auto' GatewayReceiver was not properly configured or initialized!", autoGatewayReceiver); + assertEquals(7070, autoGatewayReceiver.getStartPort()); + assertEquals(7700, autoGatewayReceiver.getEndPort()); + assertTrue(autoGatewayReceiver.isRunning()); + + final int gatewayReceiverPort = autoGatewayReceiver.getPort(); + + assertTrue(gatewayReceiverPort >= autoGatewayReceiver.getStartPort() + && gatewayReceiverPort <= autoGatewayReceiver.getEndPort()); + + autoGatewayReceiver.stop(); + + assertFalse(autoGatewayReceiver.isRunning()); + } + + @Test + public void testManualGatewayReceiverConfiguration() throws IOException { + assertNotNull("The 'Manual' GatewayReceiver was not properly configured or initialized!", manualGatewayReceiver); + assertFalse(manualGatewayReceiver.isRunning()); + assertEquals(6060, manualGatewayReceiver.getStartPort()); + assertEquals(6600, manualGatewayReceiver.getEndPort()); + + manualGatewayReceiver.start(); + + assertTrue(manualGatewayReceiver.isRunning()); + + final int gateReceiverPort = manualGatewayReceiver.getPort(); + + assertTrue(gateReceiverPort >= manualGatewayReceiver.getStartPort() + && gateReceiverPort <= manualGatewayReceiver.getEndPort()); + + manualGatewayReceiver.stop(); + + assertFalse(manualGatewayReceiver.isRunning()); + } + +} diff --git a/src/test/resources/org/springframework/data/gemfire/config/GatewayReceiverNamespaceTest-context.xml b/src/test/resources/org/springframework/data/gemfire/config/GatewayReceiverNamespaceTest-context.xml new file mode 100644 index 00000000..ef5136b7 --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/config/GatewayReceiverNamespaceTest-context.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/src/test/resources/org/springframework/data/gemfire/wan/ManualGatewayReceiverStartIntegrationTest-context.xml b/src/test/resources/org/springframework/data/gemfire/wan/ManualGatewayReceiverStartIntegrationTest-context.xml new file mode 100644 index 00000000..f644d847 --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/wan/ManualGatewayReceiverStartIntegrationTest-context.xml @@ -0,0 +1,25 @@ + + + + + SpringDataGemFirePeerCache + 0 + config + + + + + + + + + +