HttpTestCase in das Modul test verschoben und schweren Fehler korrigiert
[percentcodec] / test / src / main / java / de / halbekunst / juplo / test / HttpTestCase.java
diff --git a/test/src/main/java/de/halbekunst/juplo/test/HttpTestCase.java b/test/src/main/java/de/halbekunst/juplo/test/HttpTestCase.java
new file mode 100644 (file)
index 0000000..76c4646
--- /dev/null
@@ -0,0 +1,84 @@
+package de.halbekunst.juplo.test;
+
+import com.meterware.httpunit.WebResponse;
+import com.meterware.servletunit.InvocationContext;
+import com.meterware.servletunit.ServletRunner;
+import com.meterware.servletunit.ServletUnitClient;
+import java.io.File;
+import java.util.Enumeration;
+import javax.servlet.http.HttpServletRequest;
+import org.junit.Before;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author kai
+ */
+public abstract class HttpTestCase {
+
+  private final static Logger log = LoggerFactory.getLogger(HttpTestCase.class);
+
+  private ServletRunner sr;
+  private File config;
+  public ServletUnitClient client;
+
+
+  public HttpTestCase(String config) {
+    this(new File(config));
+  }
+
+  public HttpTestCase(File config) {
+    if (!config.exists())
+      throw new RuntimeException("web.xml is missing: " + config + " does not exist.");
+    this.config = config;
+  }
+
+
+  @Before
+  public void init() throws Exception {
+    sr = new ServletRunner(config, ""); // Dies ist der einzige Konstruktor, der die Context-Root der Webapp im Testfall korrekt initialisiert :/
+    client = sr.newClient();
+  }
+
+  public WebResponse executeRequest(String uri) throws Exception {
+    log.debug("---------- GET: {}", uri);
+    InvocationContext invocation = client.newInvocation(uri);
+    HttpServletRequest request = invocation.getRequest();
+    log.debug("Request - {}: {}", request.getMethod(), request.getProtocol());
+    Enumeration<String> headers = request.getHeaderNames();
+    while (headers.hasMoreElements()) {
+      String header = headers.nextElement();
+      Enumeration<String> values = request.getHeaders(header);
+      while (values.hasMoreElements())
+        log.debug("Request - {}: {}", header, values.nextElement());
+    }
+
+    log.debug("Invocing service method.");
+
+    /**
+     * We cannot call invocation.service(), because we have to wrap the
+     * response. Therefore this was coppied from InvocationContextImpl.
+     */
+    LoggingHttpServletResponseWrapper wrappedResponse =
+        new LoggingHttpServletResponseWrapper(uri, invocation.getResponse());
+    if (invocation.isFilterActive()) {
+      invocation.getFilter().doFilter(invocation.getRequest(), wrappedResponse, invocation.getFilterChain());
+    }
+    else {
+      invocation.getServlet().service(invocation.getRequest(), wrappedResponse);
+    }
+    long count = wrappedResponse.close();
+
+    WebResponse response = invocation.getServletResponse();
+    log.debug("Response - {}: {}", response.getResponseCode(), response.getResponseMessage());
+    log.debug("Response - {}, {} bytes", response.getContentType(), count);
+    for (String header : response.getHeaderFieldNames()) {
+      for (String value : response.getHeaderFields(header)) {
+        log.debug("Response - {}: {}", header, value);
+      }
+    }
+    return response;
+  }
+}
+