1 package de.halbekunst.juplo.cachecontrol;
3 import com.meterware.httpunit.WebResponse;
4 import de.halbekunst.juplo.test.HttpTestCase;
5 import de.halbekunst.juplo.test.LoggingHttpServletResponseWrapper;
6 import java.net.URLEncoder;
8 import org.junit.runner.RunWith;
9 import java.text.SimpleDateFormat;
10 import java.util.Locale;
11 import org.junit.Assert;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
14 import org.springframework.test.context.ContextConfiguration;
15 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
23 @RunWith(SpringJUnit4ClassRunner.class)
24 @ContextConfiguration(locations = {
25 "classpath:/config.xml"
27 public class RequestSizeTest extends HttpTestCase {
28 private final static Logger log = LoggerFactory.getLogger(RequestSizeTest.class);
31 public RequestSizeTest() {
32 super("src/test/resources/web.xml");
37 public void testSimpleRequestWithGzip() throws Exception {
39 log.info("-------- Test: gzipped simple request");
41 client.getClientProperties().setAcceptGzip(true);
43 for (int i=0; i<33; i++) {
44 /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
45 WebResponse response = executeRequest("http://localhost/request-size?n=" + i*128);
46 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
47 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
49 Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
51 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
52 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
53 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
54 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
55 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
56 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
57 long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
58 long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
59 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
64 public void testSimpleRequestWithoutGzip() throws Exception {
66 log.info("-------- Test: uncompressed simple request");
68 client.getClientProperties().setAcceptGzip(false);
70 for (int i=0; i<33; i++) {
71 /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
72 WebResponse response = executeRequest("http://localhost/request-size?n=" + i*128);
73 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
74 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
75 Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
76 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
77 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
78 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
79 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
80 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
81 long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
82 long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
83 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
88 public void testForwardWithGzip() throws Exception {
90 log.info("-------- Test: gzipped request with forward");
92 client.getClientProperties().setAcceptGzip(true);
95 * Auf den Fehler bei einem Forward nach Überschreitung der Puffer-Größe
96 * des ursprünglichen Requests wird hier nicht geprüft, weil der Puffer
97 * durch die Komprimierung bei den hier gewählten Test-Parametern nie
98 * vollgeschrieben wird, so dass er stets ohne Fehler zurückgesetzt
101 * Dafür wird hier zusätzlich geprüft, ob die Komprimierung korrekt nur
102 * dann unterdrückt wird, wenn die gesamte Antwort leer ist (und nicht nur
103 * der initiale Request, der geforwarded wird).
105 for (int i=0; i<33; i++) {
106 /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
107 StringBuilder uri = new StringBuilder();
108 uri.append("http://localhost/request-size");
112 uri.append(URLEncoder.encode("/forwarded?n=" + i*128, "UTF-8"));
113 WebResponse response = executeRequest(uri.toString());
114 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
115 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
117 Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
119 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
120 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
121 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
122 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
123 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
124 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
125 long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
126 long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
127 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
132 public void testForwardWithoutGzip() throws Exception {
134 log.info("-------- Test: uncompressed request with forward");
136 client.getClientProperties().setAcceptGzip(false);
138 for (int i=0; i<33; i++) {
139 /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
140 StringBuilder uri = new StringBuilder();
141 uri.append("http://localhost/request-size");
145 uri.append(URLEncoder.encode("/forwarded?n=" + i*128, "UTF-8"));
147 WebResponse response = executeRequest(uri.toString());
148 if (i*128 > LoggingHttpServletResponseWrapper.DEFAULT_BUFFER_SIZE)
149 Assert.fail("Error expected while forwarding after " + i*128 + " bytes written!");
150 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
151 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
152 Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
153 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
154 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
155 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
156 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
157 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
158 long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
159 long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
160 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
162 catch (IllegalStateException e) {
163 if (i*128 > LoggingHttpServletResponseWrapper.DEFAULT_BUFFER_SIZE)
164 log.debug("Expected error while forwarding after {} bytes written: {}", i*128, e.getMessage());
166 Assert.fail("Unexpected error while forwarding after " + i*128 + " bytes written: " + e.getMessage());
172 public void testIncludeWithGzip() throws Exception {
174 log.info("-------- Test: gzipped request with includes");
176 client.getClientProperties().setAcceptGzip(true);
178 for (int i=0; i<33; i++) {
179 /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
180 StringBuilder uri = new StringBuilder();
181 uri.append("http://localhost/request-size");
184 for (int j=0; j < i%4+1; j++) {
186 uri.append(URLEncoder.encode("/included?n=" + i*32*(4-j), "UTF-8"));
188 WebResponse response = executeRequest(uri.toString());
189 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
190 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
192 Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
194 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
195 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
196 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
197 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
198 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
199 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
200 long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
201 long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
202 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
207 public void testIncludeWithoutGzip() throws Exception {
209 log.info("-------- Test: uncompressed request with includes");
211 client.getClientProperties().setAcceptGzip(false);
213 for (int i=0; i<33; i++) {
214 /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
215 StringBuilder uri = new StringBuilder();
216 uri.append("http://localhost/request-size");
219 for (int j=0; j < i%4+1; j++) {
221 uri.append(URLEncoder.encode("/included?n=" + i*32*(4-j), "UTF-8"));
223 WebResponse response = executeRequest(uri.toString());
224 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
225 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
226 Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
227 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
228 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
229 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
230 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
231 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
232 long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
233 long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
234 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);