342a8f2fb56ad76c6517827e01fee482f789fb02
[percentcodec] / accelerator / src / test / java / de / juplo / accelerator / ParameterGuessingTest.java
1 package de.juplo.accelerator;
2
3 import com.meterware.httpunit.WebResponse;
4 import de.juplo.testingtools.HttpTestCase;
5 import java.net.URLEncoder;
6 import org.junit.Test;
7 import org.junit.runner.RunWith;
8 import java.text.SimpleDateFormat;
9 import java.util.Calendar;
10 import java.util.Date;
11 import java.util.HashSet;
12 import java.util.Locale;
13 import java.util.Set;
14 import org.junit.Assert;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17 import org.springframework.test.context.ContextConfiguration;
18 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
19
20
21
22 /**
23  *
24  * @author kai
25  */
26 @RunWith(SpringJUnit4ClassRunner.class)
27 @ContextConfiguration(locations = {
28   "classpath:/config.xml"
29 })
30 public class ParameterGuessingTest extends HttpTestCase {
31   private final static Logger log = LoggerFactory.getLogger(ParameterGuessingTest.class);
32
33
34   public ParameterGuessingTest() {
35     super("src/test/resources/web.xml");
36   }
37
38
39   @Test
40   public void testNothingSet() throws Exception {
41
42     log.info("-------- Test: Servlet does not implement getLastModified() and sets no Headers...");
43
44     WebResponse response = executeRequest("http://localhost/parameter-guessing?n=16");
45     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
46     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
47     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
48     Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
49     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
50     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
51     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
52     SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
53     long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
54     long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
55     Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
56   }
57
58   @Test
59   public void testSetUnfilteredHeaders() throws Exception {
60
61     log.info("-------- Test: Servlet sets unfiltered Headers...");
62
63     WebResponse response = executeRequest("http://localhost/parameter-guessing?n=16&X-Debug=bla&Age=34&Content-Language=de");
64     Assert.assertEquals("bla", response.getHeaderField("X-Debug"));
65     Assert.assertEquals("34", response.getHeaderField("Age"));
66     Assert.assertEquals("de", response.getHeaderField("Content-Language"));
67     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
68     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
69     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
70     Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
71     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
72     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
73     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
74     SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
75     long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
76     long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
77     Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
78   }
79
80   @Test
81   public void testETagSet() throws Exception {
82
83     log.info("-------- Test: Servlet sets Header \"ETag\"");
84
85     SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
86     WebResponse response;
87     long date, expires;
88
89     response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("\"bla\"", "UTF-8"));
90     Assert.assertEquals("\"bla\"", response.getHeaderField(Headers.HEADER_ETAG));
91     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
92     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
93     Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
94     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
95     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
96     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
97     date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
98     expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
99     Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
100
101     response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("\"bÄl\"a\"", "UTF-8"));
102     Assert.assertEquals("\"bla\"", response.getHeaderField(Headers.HEADER_ETAG));
103     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
104     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
105     Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
106     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
107     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
108     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
109     date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
110     expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
111     Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
112
113     response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("bla", "UTF-8"));
114     Assert.assertEquals("\"bla\"", response.getHeaderField(Headers.HEADER_ETAG));
115     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
116     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
117     Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
118     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
119     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
120     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
121     date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
122     expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
123     Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
124
125     response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("bÄl\"a", "UTF-8"));
126     Assert.assertEquals("\"bla\"", response.getHeaderField(Headers.HEADER_ETAG));
127     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
128     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
129     Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
130     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
131     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
132     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
133     date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
134     expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
135     Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
136
137     response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("W/\"blub\"", "UTF-8"));
138     Assert.assertEquals("W/\"blub\"", response.getHeaderField(Headers.HEADER_ETAG));
139     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
140     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
141     Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
142     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
143     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
144     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
145     date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
146     expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
147     Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
148
149     response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("W/\"bÄl\"ub\"", "UTF-8"));
150     Assert.assertEquals("W/\"blub\"", response.getHeaderField(Headers.HEADER_ETAG));
151     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
152     Assert.assertEquals("gzip", 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     date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
158     expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
159     Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
160
161     response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("W/blub", "UTF-8"));
162     Assert.assertEquals("W/\"blub\"", response.getHeaderField(Headers.HEADER_ETAG));
163     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
164     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
165     Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
166     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
167     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
168     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
169     date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
170     expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
171     Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
172
173     response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("W/bÄl\"ub", "UTF-8"));
174     Assert.assertEquals("W/\"blub\"", response.getHeaderField(Headers.HEADER_ETAG));
175     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
176     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
177     Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
178     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
179     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
180     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
181     date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
182     expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
183     Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
184   }
185
186   @Test
187   public void testLastModifiedImplemented() throws Exception {
188
189     log.info("-------- Test: Servlet implements getLastModified()");
190
191     WebResponse response = executeRequest("http://localhost/parameter-guessing?n=16&l=1324162929861");
192     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
193     Assert.assertEquals("Sat, 17 Dec 2011 23:02:09 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
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   @Test
206   public void testCacheControlSet() throws Exception {
207
208     log.info("-------- Test: Servlet sets Header \"Cache-Control\"");
209
210     SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
211     StringBuilder uri;
212     WebResponse response;
213     Date date;
214     long expires;
215     Set<String> params;
216     Calendar calendar = Calendar.getInstance();
217     calendar.set(Calendar.MILLISECOND, 0);
218
219     /** max-age=120 */
220     uri = new StringBuilder();
221     uri.append("http://localhost/parameter-guessing");
222     uri.append("?n=16");
223     uri.append("&Cache-Control=");
224     uri.append(URLEncoder.encode("max-age=120", "UTF-8"));
225     response = executeRequest(uri.toString());
226     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
227     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
228     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
229     Assert.assertEquals("max-age=120", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
230     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
231     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
232     date = df.parse(response.getHeaderField(Headers.HEADER_DATE));
233     expires = (date.getTime()/1000l + 120l) * 1000l;
234     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
235     Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires, df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
236
237     /** max-age=120, s-max-age=60, private, must-revalidate  */
238     uri = new StringBuilder();
239     uri.append("http://localhost/parameter-guessing");
240     uri.append("?n=16");
241     uri.append("&Cache-Control=");
242     uri.append(URLEncoder.encode("max-age=120, s-max-age=60, must-revalidate", "UTF-8"));
243     response = executeRequest(uri.toString());
244     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
245     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
246     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
247     params = new HashSet<String>();
248     for (String param : response.getHeaderFields(Headers.HEADER_CACHE_CONTROL))
249       for (String part : param.split(","))
250         params.add(part.trim());
251     Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"max-age=120\" nicht!", params.contains("max-age=120"));
252     Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"s-max-age=60\" nicht!", params.contains("s-max-age=60"));
253     Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"must-revalidate\" nicht!", params.contains("must-revalidate"));
254     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
255     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
256     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
257     date = df.parse(response.getHeaderField(Headers.HEADER_DATE));
258     expires = (date.getTime()/1000l + 120l) * 1000l;
259     Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires, df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
260
261     /** max-age=120, s-max-age=60, private, must-revalidate, BUT: several other values are set before  */
262     uri = new StringBuilder();
263     uri.append("http://localhost/parameter-guessing");
264     uri.append("?n=16");
265     uri.append("&Cache-Control=");
266     uri.append(URLEncoder.encode("no-store", "UTF-8"));
267     uri.append("&Cache-Control=");
268     uri.append(URLEncoder.encode("max-age=360, s-max-age=600, private", "UTF-8"));
269     uri.append("&Cache-Control=");
270     uri.append(URLEncoder.encode("public", "UTF-8"));
271     uri.append("&Cache-Control=");
272     uri.append(URLEncoder.encode("max-age=120, s-max-age=60, must-revalidate", "UTF-8"));
273     response = executeRequest(uri.toString());
274     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
275     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
276     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
277     params = new HashSet<String>();
278     for (String param : response.getHeaderFields(Headers.HEADER_CACHE_CONTROL))
279       for (String part : param.split(","))
280         params.add(part.trim());
281     Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"max-age=120\" nicht!", params.contains("max-age=120"));
282     Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"s-max-age=60\" nicht!", params.contains("s-max-age=60"));
283     Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"must-revalidate\" nicht!", params.contains("must-revalidate"));
284     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
285     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
286     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
287     date = df.parse(response.getHeaderField(Headers.HEADER_DATE));
288     expires = (date.getTime()/1000l + 120l) * 1000l;
289     Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires, df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
290   }
291
292   @Test
293   public void testDateSet() throws Exception {
294
295     log.info("-------- Test: Servlet sets Header \"Date\"");
296
297     SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
298     StringBuilder uri;
299     WebResponse response;
300     Date date, expires;
301     Calendar calendar = Calendar.getInstance();
302     calendar.set(Calendar.MILLISECOND, 0);
303
304     /** Date ca NOW -1m */
305     calendar.add(Calendar.MINUTE, -1);
306     date = calendar.getTime();
307     calendar.add(Calendar.MINUTE, 60); /** default max-age=3600 yields 60m! */
308     expires = calendar.getTime();
309     uri = new StringBuilder();
310     uri.append("http://localhost/parameter-guessing");
311     uri.append("?n=16");
312     uri.append("&Date=");
313     uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
314     response = executeRequest(uri.toString());
315     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
316     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
317     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
318     Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
319     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
320     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
321     Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
322     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
323     Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
324
325     /** Date ca NOW -1m, BUT: is set to some garbage values before */
326     calendar.add(Calendar.MINUTE, -1);
327     date = calendar.getTime();
328     calendar.add(Calendar.MINUTE, 60); /** default max-age=3600 yields 60m! */
329     expires = calendar.getTime();
330     uri = new StringBuilder();
331     uri.append("http://localhost/parameter-guessing");
332     uri.append("?n=16");
333     uri.append("&Date=");
334     calendar.add(Calendar.MINUTE, 10);
335     uri.append(URLEncoder.encode(df.format(calendar.getTime()), "UTF-8"));
336     uri.append("&Date=");
337     calendar.add(Calendar.HOUR, -2);
338     uri.append(URLEncoder.encode(df.format(calendar.getTime()), "UTF-8"));
339     uri.append("&Date=");
340     calendar.add(Calendar.DATE, 1);
341     uri.append(URLEncoder.encode(df.format(calendar.getTime()), "UTF-8"));
342     uri.append("&Date=");
343     uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
344     response = executeRequest(uri.toString());
345     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
346     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
347     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
348     Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
349     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
350     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
351     Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
352     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
353     Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
354   }
355
356   @Test
357   public void testExpiresSet() throws Exception {
358
359     log.info("-------- Test: Servlet sets Header \"Expires\"");
360
361     SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
362     StringBuilder uri;
363     WebResponse response;
364     Date date, expires;
365     long age;
366     Calendar calendar = Calendar.getInstance();
367     calendar.set(Calendar.MILLISECOND, 0);
368
369     /** Expires ca. NOW + 10m */
370     calendar.add(Calendar.MINUTE, 10);
371     expires = calendar.getTime();
372     uri = new StringBuilder();
373     uri.append("http://localhost/parameter-guessing");
374     uri.append("?n=16");
375     uri.append("&Expires=");
376     uri.append(URLEncoder.encode(df.format(expires), "UTF-8"));
377     response = executeRequest(uri.toString());
378     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
379     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
380     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
381     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
382     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
383     date = df.parse(response.getHeaderField(Headers.HEADER_DATE));
384     age = (expires.getTime() - date.getTime())/1000l;
385     Assert.assertEquals("max-age=" + age, response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
386     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
387     Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
388
389     /** Expires ca. NOW + 10m, BUT: is set to some garbage values before */
390     calendar.add(Calendar.MINUTE, 10);
391     uri = new StringBuilder();
392     uri.append("http://localhost/parameter-guessing");
393     uri.append("?n=16");
394     uri.append("&Expires=");
395     calendar.add(Calendar.MINUTE, 10);
396     uri.append(URLEncoder.encode(df.format(calendar.getTime()), "UTF-8"));
397     uri.append("&Expires=");
398     calendar.add(Calendar.HOUR, -2);
399     uri.append(URLEncoder.encode(df.format(calendar.getTime()), "UTF-8"));
400     uri.append("&Expires=");
401     calendar.add(Calendar.DATE, 1);
402     uri.append(URLEncoder.encode(df.format(calendar.getTime()), "UTF-8"));
403     uri.append("&Expires=");
404     uri.append(URLEncoder.encode(df.format(expires), "UTF-8"));
405     response = executeRequest(uri.toString());
406     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
407     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
408     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
409     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
410     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
411     date = df.parse(response.getHeaderField(Headers.HEADER_DATE));
412     age = (expires.getTime() - date.getTime())/1000l;
413     Assert.assertEquals("max-age=" + age, response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
414     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
415     Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
416   }
417
418   @Test
419   public void testDateAndExpiresSet() throws Exception {
420
421     log.info("-------- Test: Servlet sets Header's \"Date\" and \"Expires\"");
422
423     SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
424     StringBuilder uri;
425     WebResponse response;
426     Date date, expires, garbage;
427     Calendar calendar = Calendar.getInstance();
428     calendar.set(Calendar.MILLISECOND, 0);
429
430     /** Expires = Date + 30m */
431     date = calendar.getTime();
432     calendar.add(Calendar.MINUTE, 30);
433     expires = calendar.getTime();
434     uri = new StringBuilder();
435     uri.append("http://localhost/parameter-guessing");
436     uri.append("?n=16");
437     uri.append("&Date=");
438     uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
439     uri.append("&Expires=");
440     uri.append(URLEncoder.encode(df.format(expires), "UTF-8"));
441     response = executeRequest(uri.toString());
442     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
443     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
444     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
445     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
446     Assert.assertEquals("max-age=1800", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
447     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
448     Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
449     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
450     Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
451
452     /** Expires = Date + 30m, BUT: Date is set to Date - 2h first and Expires to Date */
453     date = calendar.getTime();
454     calendar.add(Calendar.MINUTE, 30);
455     expires = calendar.getTime();
456     calendar.add(Calendar.HOUR, -2);
457     garbage = calendar.getTime();
458     uri = new StringBuilder();
459     uri.append("http://localhost/parameter-guessing");
460     uri.append("?n=16");
461     uri.append("&Date=");
462     uri.append(URLEncoder.encode(df.format(garbage), "UTF-8"));
463     uri.append("&Expires=");
464     uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
465     uri.append("&Date=");
466     uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
467     uri.append("&Expires=");
468     uri.append(URLEncoder.encode(df.format(expires), "UTF-8"));
469     response = executeRequest(uri.toString());
470     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
471     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
472     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
473     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
474     Assert.assertEquals("max-age=1800", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
475     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
476     Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
477     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
478     Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
479
480     /** Expires = Date - 1h --> will be ignored! */
481     date = calendar.getTime();
482     calendar.add(Calendar.MINUTE, -60);
483     garbage = calendar.getTime();
484     calendar.setTime(date);
485     calendar.add(Calendar.MINUTE, 60); /** default max-age=3600 yields 60m! */
486     expires = calendar.getTime();
487     uri = new StringBuilder();
488     uri.append("http://localhost/parameter-guessing");
489     uri.append("?n=16");
490     uri.append("&Date=");
491     uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
492     uri.append("&Expires=");
493     uri.append(URLEncoder.encode(df.format(garbage), "UTF-8"));
494     response = executeRequest(uri.toString());
495     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
496     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
497     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
498     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
499     Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
500     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
501     Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
502     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
503     Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
504   }
505
506   @Test
507   public void testCacheControlDateAndExpiresSet() throws Exception {
508
509     log.info("-------- Test: Servlet sets Header's \"Cache-Control\", \"Date\" and \"Expires\"");
510
511     SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
512     StringBuilder uri;
513     WebResponse response;
514     Date date, expires, expected;
515     Set<String> params;
516     Calendar calendar = Calendar.getInstance();
517     calendar.set(Calendar.MILLISECOND, 0);
518
519     /** Expires = Date + 30m, Cache-Control: must-revalidate, no-store */
520     date = calendar.getTime();
521     calendar.add(Calendar.MINUTE, 30);
522     expires = calendar.getTime();
523     uri = new StringBuilder();
524     uri.append("http://localhost/parameter-guessing");
525     uri.append("?n=16");
526     uri.append("&Cache-Control=");
527     uri.append(URLEncoder.encode("must-revalidate, no-store", "UTF-8"));
528     uri.append("&Date=");
529     uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
530     uri.append("&Expires=");
531     uri.append(URLEncoder.encode(df.format(expires), "UTF-8"));
532     response = executeRequest(uri.toString());
533     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
534     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
535     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
536     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
537     params = new HashSet<String>();
538     for (String param : response.getHeaderFields(Headers.HEADER_CACHE_CONTROL))
539       for (String part : param.split(","))
540         params.add(part.trim());
541     Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"max-age=1800\" nicht!", params.contains("max-age=1800"));
542     Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"must-revalidate\" nicht!", params.contains("must-revalidate"));
543     Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"no-store\" nicht!", params.contains("no-store"));
544     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
545     Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
546     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
547     Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
548
549     /** Expires = Date + 30m, BUT: max-age is set to 600s */
550     date = calendar.getTime();
551     calendar.add(Calendar.MINUTE, 10);
552     expected = calendar.getTime();
553     calendar.add(Calendar.MINUTE, 20);
554     expires = calendar.getTime();
555     uri = new StringBuilder();
556     uri.append("http://localhost/parameter-guessing");
557     uri.append("?n=16");
558     uri.append("&Date=");
559     uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
560     uri.append("&Expires=");
561     uri.append(URLEncoder.encode(df.format(expires), "UTF-8"));
562     uri.append("&Cache-Control=");
563     uri.append(URLEncoder.encode("max-age=600", "UTF-8"));
564     response = executeRequest(uri.toString());
565     Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
566     Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
567     Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
568     Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
569     Assert.assertEquals("max-age=600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
570     Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
571     Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
572     Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
573     Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expected.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
574   }
575 }