Maven-Buildverzeichnisse vor git versteckt.
[percentcodec] / cachecontrol / src / test / java / de / halbekunst / juplo / cachecontrol / HttpTestCase.java
1 package de.halbekunst.juplo.cachecontrol;
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.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;
17
18 /**
19  *
20  * @author kai
21  */
22 public abstract class HttpTestCase {
23   private final static Logger log = LoggerFactory.getLogger(HttpTestCase.class);
24
25   private ServletRunner sr;
26   ServletUnitClient client;
27   int buffer = 2048;
28
29
30   @Before
31   public void init() throws Exception {
32     sr = new ServletRunner(ParameterGuessingTest.class.getResourceAsStream("/web.xml"));
33     client = sr.newClient();
34   }
35
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());
47     }
48     log.debug("Invocing service method.");
49
50     /**
51      * We cannot call invocation.service(), because we have to wrap the
52      * response. Therefore this was coppied from InvocationContextImpl.
53      */
54     TestHttpServletResponse wrappedResponse = new TestHttpServletResponse(invocation.getResponse());
55     if (invocation.isFilterActive()) {
56       invocation.getFilter().doFilter(invocation.getRequest(), wrappedResponse, invocation.getFilterChain());
57     }
58     else {
59       invocation.getServlet().service(invocation.getRequest(), wrappedResponse);
60     }
61
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);
68       }
69     }
70     return response;
71   }
72
73
74   class TestHttpServletResponse extends HttpServletResponseWrapper {
75
76     private CountingServletOutputStream out;
77     private HttpServletResponse response;
78     private ServletOutputStream stream;
79     private PrintWriter writer;
80     private boolean committed = false;
81
82
83     TestHttpServletResponse(HttpServletResponse response) {
84       super(response);
85       this.response = response;
86     }
87
88
89     public long getCount() {
90       if (out == null)
91         return -1l;
92       else
93         return out.count;
94     }
95
96
97     @Override
98     public void flushBuffer() throws IOException {
99       committed = true;
100       super.flushBuffer();
101     }
102
103     @Override
104     public int getBufferSize() {
105       return buffer;
106     }
107
108     @Override
109     public boolean isCommitted() {
110       return committed;
111     }
112
113     @Override
114     public void reset() {
115       if (committed)
116         throw new IllegalStateException("call to reset() after response has been commited!");
117       if (out != null)
118         out.count = 0;
119       super.reset();
120     }
121
122     @Override
123     public void resetBuffer() {
124       if (committed)
125         throw new IllegalStateException("call to resetBuffer() after response has been commited!");
126       if (out != null)
127         out.count = 0;
128       super.resetBuffer();
129     }
130
131     @Override
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!");
135       buffer = size;
136     }
137
138     @Override
139     public ServletOutputStream getOutputStream() throws IOException {
140
141       if (writer != null)
142         throw new IllegalStateException("ServletOutputStream and PrintWriter cannot be requested both!");
143
144       if (stream == null) {
145         out = new CountingServletOutputStream(response.getOutputStream());
146         stream = out;
147       }
148
149       return stream;
150     }
151
152     @Override
153     public PrintWriter getWriter() throws IOException {
154
155       if (stream != null)
156         throw new IllegalStateException("ServletOutputStream and PrintWriter cannot be requested both!");
157
158       if (writer == null) {
159         out = new CountingServletOutputStream(response.getOutputStream());
160         writer = new PrintWriter(out);
161       }
162
163       return writer;
164     }
165
166
167     class CountingServletOutputStream extends ServletOutputStream {
168
169       private ServletOutputStream out;
170       long count = 0l;
171
172
173       CountingServletOutputStream(ServletOutputStream out) {
174         this.out = out;
175       }
176
177
178       @Override
179       public void write(int i) throws IOException {
180         count++;
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);
184           committed = true;
185         }
186         out.write(i);
187       }
188     }
189   }
190 }
191