package vnet.sms.gateway.server.framework;
import static org.easymock.EasyMock.createNiceMock;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.jboss.netty.channel.group.DefaultChannelGroup;
import org.jboss.netty.handler.codec.serialization.ClassResolvers;
import org.jboss.netty.handler.codec.serialization.ObjectDecoder;
import org.jboss.netty.handler.codec.serialization.ObjectEncoder;
import org.jboss.netty.util.HashedWheelTimer;
import org.junit.Test;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jmx.export.MBeanExporter;
import vnet.sms.common.wme.jmsbridge.WindowedMessageEventToJmsMessageConverter;
import vnet.sms.gateway.nettysupport.monitor.incoming.InitialChannelEventsMonitor;
import vnet.sms.gateway.server.framework.internal.channel.GatewayServerChannelPipelineFactory;
import vnet.sms.gateway.server.framework.internal.jmsbridge.IncomingMessagesForwardingJmsBridge;
import vnet.sms.gateway.server.framework.spi.GatewayServerDescription;
import vnet.sms.gateway.server.framework.test.DenyAllAuthenticationManager;
import vnet.sms.gateway.server.framework.test.SerialIntegersMessageReferenceGenerator;
import vnet.sms.gateway.transports.serialization.ReferenceableMessageContainer;
import vnet.sms.gateway.transports.serialization.incoming.SerializationTransportProtocolAdaptingUpstreamChannelHandler;
import vnet.sms.gateway.transports.serialization.outgoing.SerializationTransportProtocolAdaptingDownstreamChannelHandler;
import com.mockrunner.jms.ConfigurationManager;
import com.mockrunner.jms.DestinationManager;
import com.mockrunner.mock.jms.MockConnectionFactory;
import com.yammer.metrics.Metrics;
public class GatewayServerBuilderTest {
@Test(expected = IllegalStateException.class)
public final void assertThatAfterPropertiesSetRefusesToBeCalledTwice()
throws Exception {
final GatewayServerBuilder<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServerBuilder<Integer, ReferenceableMessageContainer>();
objectUnderTest
.setGatewayServerDescription(new TestGatewayServerDescription());
objectUnderTest
.setInstanceId("assertThatAfterPropertiesSetRefusesToBeCalledTwice");
objectUnderTest.setPort(1000);
objectUnderTest
.setChannelPipelineFactory(createNiceMock(GatewayServerChannelPipelineFactory.class));
objectUnderTest.afterPropertiesSet();
objectUnderTest.afterPropertiesSet();
}
@SuppressWarnings("serial")
private static final class TestGatewayServerDescription extends
GatewayServerDescription {
public TestGatewayServerDescription() {
super("Test", 1, 0, 0, "BETA", "15");
}
}
@Test(expected = IllegalStateException.class)
public final void assertThatGetObjectRecognizesThatAfterPropertiesSetHasNotBeenCalled()
throws Exception {
final GatewayServerBuilder<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServerBuilder<Integer, ReferenceableMessageContainer>();
objectUnderTest
.setGatewayServerDescription(new TestGatewayServerDescription());
objectUnderTest
.setInstanceId("assertThatGetObjectRecognizesThatAfterPropertiesSetHasNotBeenCalled");
objectUnderTest.setPort(1000);
objectUnderTest
.setChannelPipelineFactory(createNiceMock(GatewayServerChannelPipelineFactory.class));
objectUnderTest.getObject();
}
@Test
public final void assertThatGetObjectReturnsProperGatewayServerAsSoonAsAfterPropertiesSetHasBeenCalled()
throws Exception {
final GatewayServerBuilder<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServerBuilder<Integer, ReferenceableMessageContainer>();
objectUnderTest
.setGatewayServerDescription(new TestGatewayServerDescription());
objectUnderTest
.setInstanceId("assertThatAfterPropertiesSetRefusesToBeCalledTwice");
objectUnderTest.setPort(1000);
objectUnderTest
.setChannelPipelineFactory(createNiceMock(GatewayServerChannelPipelineFactory.class));
objectUnderTest.afterPropertiesSet();
final GatewayServer<Integer, ReferenceableMessageContainer> product = objectUnderTest
.getObject();
assertNotNull(
"getObject() returned null although GatewayServer should have been built in afterPropertiesSet()",
product);
}
@Test
public final void assertThatGetObjectTypeReturnsSubtypeOfGatewayServer() {
final GatewayServerBuilder<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServerBuilder<Integer, ReferenceableMessageContainer>();
final Class<?> objectType = objectUnderTest.getObjectType();
assertTrue(
"getObjectType() should have returned a subtype of GatewayServer, yet it didn't",
GatewayServer.class.isAssignableFrom(objectType));
}
@Test
public final void assertThatIsSingletonReturnsTrue() {
final GatewayServerBuilder<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServerBuilder<Integer, ReferenceableMessageContainer>();
assertTrue("isSingleton() should have returned true",
objectUnderTest.isSingleton());
}
@Test
public final void assertThatDestroyStopsTheCreatedGatewayServer()
throws Exception {
final GatewayServerBuilder<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServerBuilder<Integer, ReferenceableMessageContainer>();
objectUnderTest
.setGatewayServerDescription(new TestGatewayServerDescription());
objectUnderTest
.setInstanceId("assertThatDestroyStopsTheCreatedGatewayServer");
objectUnderTest.setPort(65500);
objectUnderTest
.setChannelPipelineFactory(newGatewayServerChannelPipelineFactory());
objectUnderTest.afterPropertiesSet();
final GatewayServer<Integer, ReferenceableMessageContainer> product = objectUnderTest
.getObject();
product.start();
objectUnderTest.destroy();
assertEquals(
"destroy() should have stopped the created GatewayServer, yet it didn't",
ServerStatus.STOPPED, product.getCurrentStatus());
}
private GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer> newGatewayServerChannelPipelineFactory() {
return new GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer>(
"newObjectUnderTest",
ReferenceableMessageContainer.class,
new ObjectDecoder(ClassResolvers.cacheDisabled(null)),
null,
new ObjectEncoder(),
new SerializationTransportProtocolAdaptingUpstreamChannelHandler(),
new SerializationTransportProtocolAdaptingDownstreamChannelHandler(),
new IncomingMessagesForwardingJmsBridge<Integer>(
newJmsTemplate()), 100, 10000,
new DenyAllAuthenticationManager(), 10000,
new SerialIntegersMessageReferenceGenerator(), 100, 20000,
new MBeanExporter(), new InitialChannelEventsMonitor(), Metrics
.defaultRegistry(), new HashedWheelTimer(),
new DefaultChannelGroup());
}
private final JmsTemplate newJmsTemplate() {
final DestinationManager destinationManager = new DestinationManager();
destinationManager.createQueue("default.queue");
final ConfigurationManager configurationManager = new ConfigurationManager();
final MockConnectionFactory mockConnectionFactory = new MockConnectionFactory(
destinationManager, configurationManager);
final JmsTemplate jmsTemplate = new JmsTemplate(mockConnectionFactory);
jmsTemplate
.setMessageConverter(new WindowedMessageEventToJmsMessageConverter());
jmsTemplate.setDefaultDestinationName("default.queue");
return jmsTemplate;
}
}