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