Projekt von de.halbekunst.juplo nach de.juplo verschoben und aufgeräumt
[percentcodec] / accelerator / src / test / java / de / juplo / accelerator / RequestSizeTest.java
1 package de.juplo.accelerator;
2
3 import com.meterware.httpunit.WebResponse;
4 import de.juplo.testingtools.HttpTestCase;
5 import de.juplo.testingtools.LoggingHttpServletResponseWrapper;
6 import java.net.URLEncoder;
7 import org.junit.Test;
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;
16
17
18
19 /**
20  *
21  * @author kai
22  */
23 @RunWith(SpringJUnit4ClassRunner.class)
24 @ContextConfiguration(locations = {
25   "classpath:/config.xml"
26 })
27 public class RequestSizeTest extends HttpTestCase {
28   private final static Logger log = LoggerFactory.getLogger(RequestSizeTest.class);
29
30
31   public RequestSizeTest() {
32     super("src/test/resources/web.xml");
33   }
34
35
36   @Test
37   public void testSimpleRequestWithGzip() throws Exception {
38
39     log.info("-------- Test: gzipped simple request");
40
41     client.getClientProperties().setAcceptGzip(true);
42
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));
48       if (i==0)
49         Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
50       else
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);
60     }
61   }
62
63   @Test
64   public void testSimpleRequestWithoutGzip() throws Exception {
65
66     log.info("-------- Test: uncompressed simple request");
67
68     client.getClientProperties().setAcceptGzip(false);
69
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);
84     }
85   }
86
87   @Test
88   public void testForwardWithGzip() throws Exception {
89
90     log.info("-------- Test: gzipped request with forward");
91
92     client.getClientProperties().setAcceptGzip(true);
93
94     /**
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
99      * werden kann...
100      *
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).
104      */
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");
109       uri.append("?n=");
110       uri.append(i%7*128);
111       uri.append("&f=");
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));
116       if (i==0)
117         Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
118       else
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);
128     }
129   }
130
131   @Test
132   public void testForwardWithoutGzip() throws Exception {
133
134     log.info("-------- Test: uncompressed request with forward");
135
136     client.getClientProperties().setAcceptGzip(false);
137
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");
142       uri.append("?n=");
143       uri.append(i*128);
144       uri.append("&f=");
145       uri.append(URLEncoder.encode("/forwarded?n=" + i*128, "UTF-8"));
146       try {
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);
161       }
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());
165         else
166           Assert.fail("Unexpected error while forwarding after " + i*128 + " bytes written: " + e.getMessage());
167       }
168     }
169   }
170
171   @Test
172   public void testIncludeWithGzip() throws Exception {
173
174     log.info("-------- Test: gzipped request with includes");
175
176     client.getClientProperties().setAcceptGzip(true);
177
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");
182       uri.append("?n=");
183       uri.append(i%7*128);
184       for (int j=0; j < i%4+1; j++) {
185         uri.append("&i=");
186         uri.append(URLEncoder.encode("/included?n=" + i*32*(4-j), "UTF-8"));
187       }
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));
191       if (i==0)
192         Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
193       else
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);
203     }
204   }
205
206   @Test
207   public void testIncludeWithoutGzip() throws Exception {
208
209     log.info("-------- Test: uncompressed request with includes");
210
211     client.getClientProperties().setAcceptGzip(false);
212
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");
217       uri.append("?n=");
218       uri.append(i%7*128);
219       for (int j=0; j < i%4+1; j++) {
220         uri.append("&i=");
221         uri.append(URLEncoder.encode("/included?n=" + i*32*(4-j), "UTF-8"));
222       }
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);
235     }
236   }
237 }