172e3ba45488ee749e4bad2fe7e88b0760283e8f
[percentcodec] / cachecontrol / src / test / java / de / halbekunst / juplo / cachecontrol / RequestSizeTest.java
1 package de.halbekunst.juplo.cachecontrol;
2
3 import com.meterware.httpunit.WebResponse;
4 import java.net.URLEncoder;
5 import org.junit.Test;
6 import org.junit.runner.RunWith;
7 import java.text.SimpleDateFormat;
8 import java.util.Locale;
9 import org.junit.Assert;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
12 import org.springframework.test.context.ContextConfiguration;
13 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
14
15
16
17 /**
18  *
19  * @author kai
20  */
21 @RunWith(SpringJUnit4ClassRunner.class)
22 @ContextConfiguration(locations = {
23   "classpath:/config.xml"
24 })
25 public class RequestSizeTest extends HttpTestCase {
26   private final static Logger log = LoggerFactory.getLogger(RequestSizeTest.class);
27
28
29   @Test
30   public void testSimpleRequestWithGzip() throws Exception {
31
32     log.info("-------- Test: gzipped simple request");
33
34     client.getClientProperties().setAcceptGzip(true);
35
36     for (int i=0; i<33; i++) {
37       /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
38       WebResponse response = executeRequest("http://localhost/request-size?n=" + i*128);
39       Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
40       Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
41       if (i==0)
42         Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
43       else
44         Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
45       Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
46       Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
47       Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
48       Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
49       SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
50       long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
51       long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
52       Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
53     }
54   }
55
56   @Test
57   public void testSimpleRequestWithoutGzip() throws Exception {
58
59     log.info("-------- Test: uncompressed simple request");
60
61     client.getClientProperties().setAcceptGzip(false);
62
63     for (int i=0; i<33; i++) {
64       /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
65       WebResponse response = executeRequest("http://localhost/request-size?n=" + i*128);
66       Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
67       Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
68       Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
69       Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
70       Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
71       Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
72       Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
73       SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
74       long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
75       long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
76       Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
77     }
78   }
79
80   @Test
81   public void testForwardWithGzip() throws Exception {
82
83     log.info("-------- Test: gzipped request with forward");
84
85     client.getClientProperties().setAcceptGzip(true);
86
87     /**
88      * Auf den Fehler bei einem Forward nach Überschreitung der Puffer-Größe
89      * des ursprünglichen Requests wird hier nicht geprüft, weil der Puffer
90      * durch die Komprimierung bei den hier gewählten Test-Parametern nie
91      * vollgeschrieben wird, so dass er stets ohne Fehler zurückgesetzt
92      * werden kann...
93      *
94      * Dafür wird hier zusätzlich geprüft, ob die Komprimierung korrekt nur
95      * dann unterdrückt wird, wenn die gesamte Antwort leer ist (und nicht nur
96      * der initiale Request, der geforwarded wird).
97      */
98     for (int i=0; i<33; i++) {
99       /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
100       StringBuilder uri = new StringBuilder();
101       uri.append("http://localhost/request-size");
102       uri.append("?n=");
103       uri.append(i%7*128);
104       uri.append("&f=");
105       uri.append(URLEncoder.encode("/forwarded?n=" + i*128, "UTF-8"));
106       WebResponse response = executeRequest(uri.toString());
107       Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
108       Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
109       if (i==0)
110         Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
111       else
112         Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
113       Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
114       Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
115       Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
116       Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
117       SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
118       long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
119       long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
120       Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
121     }
122   }
123
124   @Test
125   public void testForwardWithoutGzip() throws Exception {
126
127     log.info("-------- Test: uncompressed request with forward");
128
129     client.getClientProperties().setAcceptGzip(false);
130
131     for (int i=0; i<33; i++) {
132       /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
133       StringBuilder uri = new StringBuilder();
134       uri.append("http://localhost/request-size");
135       uri.append("?n=");
136       uri.append(i*128);
137       uri.append("&f=");
138       uri.append(URLEncoder.encode("/forwarded?n=" + i*128, "UTF-8"));
139       try {
140         WebResponse response = executeRequest(uri.toString());
141         if (i*128 > 2048)
142           Assert.fail("Error expected while forwarding after " + i*128 + " bytes written!");
143         Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
144         Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
145         Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
146         Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
147         Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
148         Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
149         Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
150         SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
151         long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
152         long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
153         Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
154       }
155       catch (IllegalStateException e) {
156         if (i*128 > 2048)
157           log.debug("Expected error while forwarding after {} bytes written: {}", i*128, e.getMessage());
158         else
159           Assert.fail("Unexpected error while forwarding after " + i*128 + " bytes written: " + e.getMessage());
160       }
161     }
162   }
163
164   @Test
165   public void testIncludeWithGzip() throws Exception {
166
167     log.info("-------- Test: gzipped request with includes");
168
169     client.getClientProperties().setAcceptGzip(true);
170
171     for (int i=0; i<33; i++) {
172       /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
173       StringBuilder uri = new StringBuilder();
174       uri.append("http://localhost/request-size");
175       uri.append("?n=");
176       uri.append(i%7*128);
177       for (int j=0; j < i%4+1; j++) {
178         uri.append("&i=");
179         uri.append(URLEncoder.encode("/included?n=" + i*32*(4-j), "UTF-8"));
180       }
181       WebResponse response = executeRequest(uri.toString());
182       Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
183       Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
184       if (i==0)
185         Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
186       else
187         Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
188       Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
189       Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
190       Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
191       Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
192       SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
193       long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
194       long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
195       Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
196     }
197   }
198
199   @Test
200   public void testIncludeWithoutGzip() throws Exception {
201
202     log.info("-------- Test: uncompressed request with includes");
203
204     client.getClientProperties().setAcceptGzip(false);
205
206     for (int i=0; i<33; i++) {
207       /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
208       StringBuilder uri = new StringBuilder();
209       uri.append("http://localhost/request-size");
210       uri.append("?n=");
211       uri.append(i%7*128);
212       for (int j=0; j < i%4+1; j++) {
213         uri.append("&i=");
214         uri.append(URLEncoder.encode("/included?n=" + i*32*(4-j), "UTF-8"));
215       }
216       WebResponse response = executeRequest(uri.toString());
217       Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
218       Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
219       Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
220       Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
221       Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
222       Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
223       Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
224       SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
225       long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
226       long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
227       Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
228     }
229   }
230 }