package org.addsimplicity.anicetus.web;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.UUID;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Before;
import org.junit.Test;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;
import org.springframework.context.ApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.request.RequestContextListener;
import org.springframework.web.context.support.WebApplicationContextUtils;
/**
* Unit test for simple App.
*/
@SuppressWarnings("unchecked")
public class SessionTest {
private static final int s_PORT = 9191;
private static Set<String> s_exclHeaders = new HashSet<String>();
private static Set<String> s_exclParams = new HashSet<String>();
static {
s_exclHeaders.add("X-Anicetus-Parent-GUID");
}
static {
s_exclParams.add("notpassed");
}
Server m_server;
ServletHolder m_servletHolder;
private JsonNode parseResponse(HttpEntity entity) throws IOException {
JsonFactory fact = new JsonFactory();
JsonParser parser = fact.createJsonParser(entity.getContent());
ObjectMapper mapper = new ObjectMapper();
return mapper.readTree(parser);
}
@Before
public void startServletEngine() {
m_server = new Server();
Connector conn = new SocketConnector();
conn.setPort(s_PORT);
m_server.setConnectors(new Connector[] { conn });
Context ctx = new Context(m_server, "/");
ctx.getInitParams()
.put("contextConfigLocation",
"classpath:org/addsimplicity/anicetus/web/JMSLaunch.xml,classpath:org/addsimplicity/anicetus/web/SessionTestBinding.xml");
ContextLoaderListener ctxLoader = new ContextLoaderListener();
ctx.addEventListener(ctxLoader);
RequestContextListener listener = new RequestContextListener();
ctx.addEventListener(listener);
ctx.addFilter(TelemetryServletFilter.class, "/", 1);
m_servletHolder = ctx.addServlet(EchoServlet.class, "/");
}
@Test
public void testBasicRequest() throws Exception {
m_server.start();
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://localhost:" + s_PORT + "/?a=1&b=2");
get.setHeader("Content-Type", "text/plain");
HttpResponse resp = client.execute(get);
HttpEntity entity = resp.getEntity();
JsonNode node = parseResponse(entity);
ApplicationContext curCtx = WebApplicationContextUtils
.getWebApplicationContext(m_servletHolder.getServlet()
.getServletConfig().getServletContext());
JmsTemplate tmpl = (JmsTemplate) curCtx.getBean("consumeTempl");
Object obj = tmpl.receiveAndConvert();
assertNotNull(obj);
assertTrue(obj instanceof TelemetryHttpSession);
TelemetryHttpSession hsess = (TelemetryHttpSession) obj;
validateHeaders(node, resp, hsess);
validateParams(node, hsess);
m_server.stop();
}
@Test
public void testParentAndBlock() throws Exception {
m_server.start();
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://localhost:" + s_PORT
+ "/?a=1&b=2¬passed=3");
get.setHeader("Content-Type", "text/plain");
UUID parent = UUID.randomUUID();
get.setHeader("X-Anicetus-Parent-GUID", parent.toString());
HttpResponse resp = client.execute(get);
HttpEntity entity = resp.getEntity();
JsonNode node = parseResponse(entity);
ApplicationContext curCtx = WebApplicationContextUtils
.getWebApplicationContext(m_servletHolder.getServlet()
.getServletConfig().getServletContext());
JmsTemplate tmpl = (JmsTemplate) curCtx.getBean("consumeTempl");
Object obj = tmpl.receiveAndConvert();
assertNotNull(obj);
assertTrue(obj instanceof TelemetryHttpSession);
TelemetryHttpSession hsess = (TelemetryHttpSession) obj;
assertEquals("parent", parent, hsess.getParentId());
validateHeaders(node, resp, hsess);
validateParams(node, hsess);
m_server.stop();
}
private void validateHeaders(JsonNode node, HttpResponse resp,
TelemetryHttpSession hsess) throws Exception {
JsonNode hnode = node.get("HEADERS");
Iterator<JsonNode> hiter = hnode.getElements();
while (hiter.hasNext()) {
JsonNode h = hiter.next();
Iterator<String> names = h.getFieldNames();
while (names.hasNext()) {
String n = names.next();
if (s_exclHeaders.contains(n)) {
continue;
}
Iterator<JsonNode> viter = h.get(n).getElements();
String svals[] = hsess.getHeaderValues(n, HeaderType.Request);
assertNotNull(n, svals);
for (int v = 0; viter.hasNext(); v++) {
String hval = svals[v];
String nval = viter.next().getTextValue();
assertEquals(n + "[" + v + "]", nval, hval);
}
}
}
for (Header rh : resp.getAllHeaders()) {
String name = rh.getName();
if (name.equals("Server")) {
continue;
}
String value = rh.getValue();
assertEquals(name, value,
hsess.getHeader(name, HeaderType.Response));
}
}
private void validateParams(JsonNode node, TelemetryHttpSession hsess)
throws Exception {
JsonNode pnode = node.get("PARAMS");
Iterator<JsonNode> piter = pnode.getElements();
while (piter.hasNext()) {
JsonNode p = piter.next();
Iterator<String> names = p.getFieldNames();
while (names.hasNext()) {
String n = names.next();
if (s_exclParams.contains(n)) {
continue;
}
String val = p.get(n).getValueAsText();
assertEquals(n, val, hsess.getParameter(n));
}
}
}
}