--- /dev/null
+package de.halbekunst.juplo.cachecontrol;
+
+import com.meterware.httpunit.WebResponse;
+import java.net.URLEncoder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+import org.junit.Assert;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+
+
+/**
+ *
+ * @author kai
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "classpath:/config.xml"
+})
+public class RequestSizeTest extends HttpTestCase {
+ private final static Logger log = LoggerFactory.getLogger(RequestSizeTest.class);
+
+
+ @Test
+ public void testSimpleRequestWithGzip() throws Exception {
+
+ log.info("-------- Test: gzipped simple request");
+
+ client.getClientProperties().setAcceptGzip(true);
+
+ for (int i=0; i<33; i++) {
+ /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
+ WebResponse response = executeRequest("http://localhost/request-size?n=" + i*128);
+ Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
+ Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
+ if (i==0)
+ Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
+ else
+ Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
+ Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
+ Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
+ Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
+ Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
+ SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
+ long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
+ long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
+ Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
+ }
+ }
+
+ @Test
+ public void testSimpleRequestWithoutGzip() throws Exception {
+
+ log.info("-------- Test: uncompressed simple request");
+
+ client.getClientProperties().setAcceptGzip(false);
+
+ for (int i=0; i<33; i++) {
+ /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
+ WebResponse response = executeRequest("http://localhost/request-size?n=" + i*128);
+ Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
+ Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
+ Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
+ Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
+ Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
+ Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
+ Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
+ SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
+ long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
+ long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
+ Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
+ }
+ }
+
+ @Test
+ public void testForwardWithGzip() throws Exception {
+
+ log.info("-------- Test: gzipped request with forward");
+
+ client.getClientProperties().setAcceptGzip(true);
+
+ for (int i=0; i<33; i++) {
+ /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
+ StringBuilder uri = new StringBuilder();
+ uri.append("http://localhost/request-size");
+ uri.append("?n=");
+ uri.append(i*128);
+ uri.append("&f=");
+ uri.append(URLEncoder.encode("/forwarded?n=" + i*128, "UTF-8"));
+ WebResponse response = executeRequest(uri.toString());
+ Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
+ Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
+ if (i==0)
+ Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
+ else
+ Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
+ Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
+ Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
+ Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
+ Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
+ SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
+ long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
+ long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
+ Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
+ }
+ }
+
+ @Test
+ public void testForwardWithoutGzip() throws Exception {
+
+ log.info("-------- Test: uncompressed request with forward");
+
+ client.getClientProperties().setAcceptGzip(false);
+
+ for (int i=0; i<33; i++) {
+ /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
+ StringBuilder uri = new StringBuilder();
+ uri.append("http://localhost/request-size");
+ uri.append("?n=");
+ uri.append(i*128);
+ uri.append("&f=");
+ uri.append(URLEncoder.encode("/forwarded?n=" + i*128, "UTF-8"));
+ try {
+ WebResponse response = executeRequest(uri.toString());
+ if (i*128 > 2048)
+ Assert.fail("Error expected while forwarding after " + i*128 + " bytes written!");
+ Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
+ Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
+ Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
+ Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
+ Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
+ Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
+ Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
+ SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
+ long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
+ long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
+ Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
+ }
+ catch (IllegalStateException e) {
+ if (i*128 > 2048)
+ log.debug("Expected error while forwarding after {} bytes written: {}", i*128, e.getMessage());
+ else
+ Assert.fail("Unexpected error while forwarding after " + i*128 + " bytes written: " + e.getMessage());
+ }
+ }
+ }
+
+ @Test
+ public void testIncludeWithGzip() throws Exception {
+
+ log.info("-------- Test: gzipped request with includes");
+
+ client.getClientProperties().setAcceptGzip(true);
+
+ for (int i=0; i<33; i++) {
+ /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
+ StringBuilder uri = new StringBuilder();
+ uri.append("http://localhost/request-size");
+ uri.append("?n=");
+ uri.append(i*128);
+ for (int j=0; j < i%4+1; j++) {
+ uri.append("&i=");
+ uri.append(URLEncoder.encode("/included?n=" + i*32*(4-j), "UTF-8"));
+ }
+ WebResponse response = executeRequest(uri.toString());
+ Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
+ Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
+ if (i==0)
+ Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
+ else
+ Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
+ Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
+ Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
+ Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
+ Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
+ SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
+ long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
+ long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
+ Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
+ }
+ }
+
+ @Test
+ public void testIncludeWithoutGzip() throws Exception {
+
+ log.info("-------- Test: uncompressed request with includes");
+
+ client.getClientProperties().setAcceptGzip(false);
+
+ for (int i=0; i<33; i++) {
+ /** 33 requests ranging from 0 B to 4 KB - response ist buffered up to 1 KB */
+ StringBuilder uri = new StringBuilder();
+ uri.append("http://localhost/request-size");
+ uri.append("?n=");
+ uri.append(i*128);
+ for (int j=0; j < i%4+1; j++) {
+ uri.append("&i=");
+ uri.append(URLEncoder.encode("/included?n=" + i*32*(4-j), "UTF-8"));
+ }
+ WebResponse response = executeRequest(uri.toString());
+ Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
+ Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
+ Assert.assertNull(response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
+ Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
+ Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
+ Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
+ Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
+ SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
+ long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
+ long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
+ Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
+ }
+ }
+}