package vnet.sms.gateway.server.framework;
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.jms.ObjectMessage;
import org.jboss.netty.channel.local.DefaultLocalServerChannelFactory;
import org.jboss.netty.channel.local.LocalAddress;
import org.junit.Test;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.security.authentication.AuthenticationManager;
import vnet.sms.common.messages.LoginRequest;
import vnet.sms.common.messages.LoginResponse;
import vnet.sms.common.messages.PingRequest;
import vnet.sms.common.messages.PingResponse;
import vnet.sms.gateway.server.framework.internal.channel.GatewayServerChannelPipelineFactory;
import vnet.sms.gateway.server.framework.spi.GatewayServerDescription;
import vnet.sms.gateway.server.framework.test.AcceptAllAuthenticationManager;
import vnet.sms.gateway.server.framework.test.DenyAllAuthenticationManager;
import vnet.sms.gateway.server.framework.test.LocalClient;
import vnet.sms.gateway.transports.serialization.ReferenceableMessageContainer;
public class LoginTest extends AbstractGatewayServerTest {
@Test
public final void assertThatGatewayServerRespondsWithASuccessfulLoginResponseToASuccessfulLoginRequest()
throws Throwable {
final int messageReference = 1;
final LocalAddress serverAddress = new LocalAddress("test:server:1");
final int availableIncomingWindows = 10;
final long incomingWindowWaitTimeMillis = 1000L;
final long failedLoginResponseMillis = 1000L;
final int pingIntervalSeconds = 100;
final long pingResponseTimeoutMillis = 2000L;
final AuthenticationManager authenticationManager = new AcceptAllAuthenticationManager();
final JmsTemplate jmsTemplate = newJmsTemplate();
final GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer> channelPipelineFactory = newGatewayServerChannelPipelineFactory(
"assertThatGatewayServerRespondsWithASuccessfulLoginResponseToASuccessfulLoginRequest",
availableIncomingWindows, incomingWindowWaitTimeMillis,
failedLoginResponseMillis, pingIntervalSeconds,
pingResponseTimeoutMillis, authenticationManager, jmsTemplate);
final GatewayServer<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServer<Integer, ReferenceableMessageContainer>(
new TestGatewayServerDescription(),
"assertThatGatewayServerRespondsWithASuccessfulLoginResponseToASuccessfulLoginRequest",
serverAddress, new DefaultLocalServerChannelFactory(),
channelPipelineFactory);
objectUnderTest.start();
final LoginRequest successfulLoginRequest = new LoginRequest(
"assertThatGatewayServerRespondsWithASuccessfulLoginResponseToASuccessfulLoginRequest",
"whatever");
final LocalClient client = new LocalClient(serverAddress);
client.connect();
final ReferenceableMessageContainer response = client
.sendMessageAndWaitForResponse(messageReference,
successfulLoginRequest);
client.disconnect();
objectUnderTest.stop();
assertEquals(
"GatewayServer should have returned messageReference of LoginRequest passed in",
messageReference, response.getMessageReference());
assertEquals("GatewayServer should have returned LoginResponse",
LoginResponse.class, response.getMessage().getClass());
assertTrue(
"GatewayServer should have returned a SUCCESSFUL LoginResponse",
LoginResponse.class.cast(response.getMessage())
.loginSucceeded());
}
@SuppressWarnings("serial")
private static final class TestGatewayServerDescription extends
GatewayServerDescription {
public TestGatewayServerDescription() {
super("Test", 1, 0, 0, "BETA", "15");
}
}
@Test
public final void assertThatGatewayServerRespondsWithAFailedLoginResponseToAFailedLoginRequest()
throws Throwable {
final int messageReference = 78;
final LocalAddress serverAddress = new LocalAddress("test:server:2");
final int availableIncomingWindows = 10;
final long incomingWindowWaitTimeMillis = 1000L;
final long failedLoginResponseMillis = 1L;
final int pingIntervalSeconds = 100;
final long pingResponseTimeoutMillis = 2000L;
final AuthenticationManager authenticationManager = new DenyAllAuthenticationManager();
final JmsTemplate jmsTemplate = newJmsTemplate();
final GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer> channelPipelineFactory = newGatewayServerChannelPipelineFactory(
"assertThatGatewayServerRespondsWithAFailedLoginResponseToAFailedLoginRequest",
availableIncomingWindows, incomingWindowWaitTimeMillis,
failedLoginResponseMillis, pingIntervalSeconds,
pingResponseTimeoutMillis, authenticationManager, jmsTemplate);
final GatewayServer<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServer<Integer, ReferenceableMessageContainer>(
new TestGatewayServerDescription(),
"assertThatGatewayServerRespondsWithAFailedLoginResponseToAFailedLoginRequest",
serverAddress, new DefaultLocalServerChannelFactory(),
channelPipelineFactory);
objectUnderTest.start();
final LoginRequest failedLoginRequest = new LoginRequest(
"assertThatGatewayServerRespondsWithAFailedLoginResponseToAFailedLoginRequest",
"whatever");
final LocalClient client = new LocalClient(serverAddress);
client.connect();
final ReferenceableMessageContainer response = client
.sendMessageAndWaitForResponse(messageReference,
failedLoginRequest);
client.disconnect();
objectUnderTest.stop();
assertEquals(
"GatewayServer should have returned messageReference of LoginRequest passed in",
messageReference, response.getMessageReference());
assertEquals("GatewayServer should have returned LoginResponse",
LoginResponse.class, response.getMessage().getClass());
assertFalse(
"GatewayServer should have returned a FAILED LoginResponse",
LoginResponse.class.cast(response.getMessage())
.loginSucceeded());
}
@Test
public final void assertThatGatewayServerForwardsSuccessfulLoginRequestToJmsServer()
throws Throwable {
final int messageReference = 1;
final LocalAddress serverAddress = new LocalAddress("test:server:3");
final int availableIncomingWindows = 10;
final long incomingWindowWaitTimeMillis = 1000L;
final long failedLoginResponseMillis = 1000L;
final int pingIntervalSeconds = 100;
final long pingResponseTimeoutMillis = 2000L;
final AuthenticationManager authenticationManager = new AcceptAllAuthenticationManager();
final JmsTemplate jmsTemplate = newJmsTemplate();
final GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer> channelPipelineFactory = newGatewayServerChannelPipelineFactory(
"assertThatGatewayServerForwardsSuccessfulLoginRequestToJmsServer",
availableIncomingWindows, incomingWindowWaitTimeMillis,
failedLoginResponseMillis, pingIntervalSeconds,
pingResponseTimeoutMillis, authenticationManager, jmsTemplate);
final GatewayServer<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServer<Integer, ReferenceableMessageContainer>(
new TestGatewayServerDescription(),
"assertThatGatewayServerForwardsSuccessfulLoginRequestToJmsServer",
serverAddress, new DefaultLocalServerChannelFactory(),
channelPipelineFactory);
objectUnderTest.start();
final LoginRequest successfulLoginRequest = new LoginRequest(
"assertThatGatewayServerForwardsSuccessfulLoginRequestToJmsServer",
"whatever");
final LocalClient client = new LocalClient(serverAddress);
client.connect();
client.sendMessage(messageReference, successfulLoginRequest);
client.disconnect();
final ObjectMessage forwardedMessage = (ObjectMessage) jmsTemplate
.receive();
objectUnderTest.stop();
assertNotNull(
"GatewayServer should have forwarded LoginRequest passed in to JMS server",
forwardedMessage);
assertEquals(
"GatewayServer should have forwarded LoginRequest passed in to JMS server",
successfulLoginRequest, forwardedMessage.getObject());
}
@Test
public final void assertThatGatewayServerForwardsFailedLoginRequestToJmsServer()
throws Throwable {
final int messageReference = 1;
final LocalAddress serverAddress = new LocalAddress("test:server:4");
final int availableIncomingWindows = 10;
final long incomingWindowWaitTimeMillis = 1000L;
final long failedLoginResponseMillis = 1000L;
final int pingIntervalSeconds = 100;
final long pingResponseTimeoutMillis = 2000L;
final AuthenticationManager authenticationManager = new DenyAllAuthenticationManager();
final JmsTemplate jmsTemplate = newJmsTemplate();
final GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer> channelPipelineFactory = newGatewayServerChannelPipelineFactory(
"assertThatGatewayServerForwardsFailedLoginRequestToJmsServer",
availableIncomingWindows, incomingWindowWaitTimeMillis,
failedLoginResponseMillis, pingIntervalSeconds,
pingResponseTimeoutMillis, authenticationManager, jmsTemplate);
final GatewayServer<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServer<Integer, ReferenceableMessageContainer>(
new TestGatewayServerDescription(),
"assertThatGatewayServerForwardsFailedLoginRequestToJmsServer",
serverAddress, new DefaultLocalServerChannelFactory(),
channelPipelineFactory);
objectUnderTest.start();
final LoginRequest failedLoginRequest = new LoginRequest(
"assertThatGatewayServerForwardsFailedLoginRequestToJmsServer",
"whatever");
final LocalClient client = new LocalClient(serverAddress);
client.connect();
client.sendMessage(messageReference, failedLoginRequest);
client.disconnect();
final ObjectMessage forwardedMessage = (ObjectMessage) jmsTemplate
.receive();
objectUnderTest.stop();
assertNotNull(
"GatewayServer should have forwarded LoginRequest passed in to JMS server",
forwardedMessage);
assertEquals(
"GatewayServer should have forwarded LoginRequest passed in to JMS server",
failedLoginRequest, forwardedMessage.getObject());
}
@Test
public final void assertThatGatewayServerDelaysResponseToFailedLoginRequest()
throws Throwable {
final int messageReference = 78;
final LocalAddress serverAddress = new LocalAddress("test:server:5");
final int availableIncomingWindows = 1000;
final long incomingWindowWaitTimeMillis = 1L;
final long failedLoginResponseMillis = 100L;
final int pingIntervalSeconds = 1000;
final long pingResponseTimeoutMillis = 200000L;
final AuthenticationManager authenticationManager = new DenyAllAuthenticationManager();
final JmsTemplate jmsTemplate = newJmsTemplate();
final GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer> channelPipelineFactory = newGatewayServerChannelPipelineFactory(
"assertThatGatewayServerDelaysResponseToFailedLoginRequest",
availableIncomingWindows, incomingWindowWaitTimeMillis,
failedLoginResponseMillis, pingIntervalSeconds,
pingResponseTimeoutMillis, authenticationManager, jmsTemplate);
final GatewayServer<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServer<Integer, ReferenceableMessageContainer>(
new TestGatewayServerDescription(),
"assertThatGatewayServerRespondsWithAFailedLoginResponseToAFailedLoginRequest",
serverAddress, new DefaultLocalServerChannelFactory(),
channelPipelineFactory);
objectUnderTest.start();
final LoginRequest failedLoginRequest = new LoginRequest(
"assertThatGatewayServerRespondsWithAFailedLoginResponseToAFailedLoginRequest",
"whatever");
final LocalClient client = new LocalClient(serverAddress);
client.connect();
final long before = System.currentTimeMillis();
client.sendMessageAndWaitForResponse(messageReference,
failedLoginRequest);
final long after = System.currentTimeMillis();
client.disconnect();
objectUnderTest.stop();
assertTrue(
"GatewayServer should have delayed response to failed LoginRequest for at least "
+ failedLoginResponseMillis + " ms",
after - before >= failedLoginResponseMillis);
}
@Test
public final void assertThatGatewayServerRejectsNonLoginMessagesOnAnUnauthenticatedChannel()
throws Throwable {
final int messageReference = 78;
final LocalAddress serverAddress = new LocalAddress("test:server:6");
final int availableIncomingWindows = 1000;
final long incomingWindowWaitTimeMillis = 1L;
final long failedLoginResponseMillis = 100L;
final int pingIntervalSeconds = 1000;
final long pingResponseTimeoutMillis = 200000L;
final AuthenticationManager authenticationManager = new DenyAllAuthenticationManager();
final JmsTemplate jmsTemplate = newJmsTemplate();
final GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer> channelPipelineFactory = newGatewayServerChannelPipelineFactory(
"assertThatGatewayServerRejectsNonLoginMessagesOnAnUnauthenticatedChannel",
availableIncomingWindows, incomingWindowWaitTimeMillis,
failedLoginResponseMillis, pingIntervalSeconds,
pingResponseTimeoutMillis, authenticationManager, jmsTemplate);
final GatewayServer<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServer<Integer, ReferenceableMessageContainer>(
new TestGatewayServerDescription(),
"assertThatGatewayServerRespondsWithAFailedLoginResponseToAFailedLoginRequest",
serverAddress, new DefaultLocalServerChannelFactory(),
channelPipelineFactory);
objectUnderTest.start();
final PingRequest nonLoginMessage = new PingRequest();
final LocalClient client = new LocalClient(serverAddress);
client.connect();
final ReferenceableMessageContainer nonLoginResponse = client
.sendMessageAndWaitForResponse(messageReference,
nonLoginMessage);
client.disconnect();
objectUnderTest.stop();
assertEquals(
"Expected channel pipeline to send (failed) PingResponse to client after failed login, yet it sent a different reply",
PingResponse.class, nonLoginResponse.getMessage().getClass());
assertFalse(
"Expected channel pipeline to send FAILED PingResponse to client after failed login, yet it sent a SUCCESSFUL PingResponse",
PingResponse.class.cast(nonLoginResponse.getMessage())
.pingSucceeded());
}
}