1 package de.halbekunst.juplo.cachecontrol;
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.IOException;
8 import java.io.PrintWriter;
9 import java.util.Enumeration;
10 import javax.servlet.ServletOutputStream;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 import javax.servlet.http.HttpServletResponseWrapper;
14 import org.junit.Before;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
22 public abstract class HttpTestCase {
23 private final static Logger log = LoggerFactory.getLogger(HttpTestCase.class);
25 private ServletRunner sr;
26 ServletUnitClient client;
31 public void init() throws Exception {
32 sr = new ServletRunner(ParameterGuessingTest.class.getResourceAsStream("/web.xml"));
33 client = sr.newClient();
36 protected WebResponse executeRequest(String uri) throws Exception {
37 log.debug("---------- GET: {}", uri);
38 InvocationContext invocation = client.newInvocation(uri);
39 HttpServletRequest request = invocation.getRequest();
40 log.debug("Request - {}: {}", request.getMethod(), request.getProtocol());
41 Enumeration<String> headers = request.getHeaderNames();
42 while (headers.hasMoreElements()) {
43 String header = headers.nextElement();
44 Enumeration<String> values = request.getHeaders(header);
45 while (values.hasMoreElements())
46 log.debug("Request - {}: {}", header, values.nextElement());
48 log.debug("Invocing service method.");
51 * We cannot call invocation.service(), because we have to wrap the
52 * response. Therefore this was coppied from InvocationContextImpl.
54 TestHttpServletResponse wrappedResponse = new TestHttpServletResponse(invocation.getResponse());
55 if (invocation.isFilterActive()) {
56 invocation.getFilter().doFilter(invocation.getRequest(), wrappedResponse, invocation.getFilterChain());
59 invocation.getServlet().service(invocation.getRequest(), wrappedResponse);
62 WebResponse response = client.getResponse(invocation);
63 log.debug("Response - {}: {}", response.getResponseCode(), response.getResponseMessage());
64 log.debug("Response - {}, {} bytes", response.getContentType(), wrappedResponse.getCount());
65 for (String header : response.getHeaderFieldNames()) {
66 for (String value : response.getHeaderFields(header)) {
67 log.debug("Response - {}: {}", header, value);
74 class TestHttpServletResponse extends HttpServletResponseWrapper {
76 private CountingServletOutputStream out;
77 private HttpServletResponse response;
78 private ServletOutputStream stream;
79 private PrintWriter writer;
80 private boolean committed = false;
83 TestHttpServletResponse(HttpServletResponse response) {
85 this.response = response;
89 public long getCount() {
98 public void flushBuffer() throws IOException {
104 public int getBufferSize() {
109 public boolean isCommitted() {
114 public void reset() {
116 throw new IllegalStateException("call to reset() after response has been commited!");
123 public void resetBuffer() {
125 throw new IllegalStateException("call to resetBuffer() after response has been commited!");
132 public void setBufferSize(int size) {
133 if (out != null && out.count > 0)
134 throw new IllegalStateException("call to setBuffer() after content has been written!");
139 public ServletOutputStream getOutputStream() throws IOException {
142 throw new IllegalStateException("ServletOutputStream and PrintWriter cannot be requested both!");
144 if (stream == null) {
145 out = new CountingServletOutputStream(response.getOutputStream());
153 public PrintWriter getWriter() throws IOException {
156 throw new IllegalStateException("ServletOutputStream and PrintWriter cannot be requested both!");
158 if (writer == null) {
159 out = new CountingServletOutputStream(response.getOutputStream());
160 writer = new PrintWriter(out);
167 class CountingServletOutputStream extends ServletOutputStream {
169 private ServletOutputStream out;
173 CountingServletOutputStream(ServletOutputStream out) {
179 public void write(int i) throws IOException {
181 /** Simulate commit, when count is getting bigger then buffer */
182 if (count == buffer + 1) {
183 log.debug("simulating commit because buffer overflow! buffer: {}, count: {}", buffer, count);