76c46468f9f25c3f474610073580b78f19660db8
[percentcodec] / test / src / main / java / de / halbekunst / juplo / test / HttpTestCase.java
1 package de.halbekunst.juplo.test;
2
3 import com.meterware.httpunit.WebResponse;
4 import com.meterware.servletunit.InvocationContext;
5 import com.meterware.servletunit.ServletRunner;
6 import com.meterware.servletunit.ServletUnitClient;
7 import java.io.File;
8 import java.util.Enumeration;
9 import javax.servlet.http.HttpServletRequest;
10 import org.junit.Before;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13
14 /**
15  *
16  * @author kai
17  */
18 public abstract class HttpTestCase {
19
20   private final static Logger log = LoggerFactory.getLogger(HttpTestCase.class);
21
22   private ServletRunner sr;
23   private File config;
24   public ServletUnitClient client;
25
26
27   public HttpTestCase(String config) {
28     this(new File(config));
29   }
30
31   public HttpTestCase(File config) {
32     if (!config.exists())
33       throw new RuntimeException("web.xml is missing: " + config + " does not exist.");
34     this.config = config;
35   }
36
37
38   @Before
39   public void init() throws Exception {
40     sr = new ServletRunner(config, ""); // Dies ist der einzige Konstruktor, der die Context-Root der Webapp im Testfall korrekt initialisiert :/
41     client = sr.newClient();
42   }
43
44   public WebResponse executeRequest(String uri) throws Exception {
45     log.debug("---------- GET: {}", uri);
46     InvocationContext invocation = client.newInvocation(uri);
47     HttpServletRequest request = invocation.getRequest();
48     log.debug("Request - {}: {}", request.getMethod(), request.getProtocol());
49     Enumeration<String> headers = request.getHeaderNames();
50     while (headers.hasMoreElements()) {
51       String header = headers.nextElement();
52       Enumeration<String> values = request.getHeaders(header);
53       while (values.hasMoreElements())
54         log.debug("Request - {}: {}", header, values.nextElement());
55     }
56
57     log.debug("Invocing service method.");
58
59     /**
60      * We cannot call invocation.service(), because we have to wrap the
61      * response. Therefore this was coppied from InvocationContextImpl.
62      */
63     LoggingHttpServletResponseWrapper wrappedResponse =
64         new LoggingHttpServletResponseWrapper(uri, invocation.getResponse());
65     if (invocation.isFilterActive()) {
66       invocation.getFilter().doFilter(invocation.getRequest(), wrappedResponse, invocation.getFilterChain());
67     }
68     else {
69       invocation.getServlet().service(invocation.getRequest(), wrappedResponse);
70     }
71     long count = wrappedResponse.close();
72
73     WebResponse response = invocation.getServletResponse();
74     log.debug("Response - {}: {}", response.getResponseCode(), response.getResponseMessage());
75     log.debug("Response - {}, {} bytes", response.getContentType(), count);
76     for (String header : response.getHeaderFieldNames()) {
77       for (String value : response.getHeaderFields(header)) {
78         log.debug("Response - {}: {}", header, value);
79       }
80     }
81     return response;
82   }
83 }
84