Improve setDateHeader impl in MockServletResponse

Prior to this change, calling the `setDateHeader` method on a
MockHttpServletResponse instance (internal implementation for testing
the spring-web module) would just store the given long value in a Map,
not writing it as a formatted date String.

This can be problematic when testing features related to date headers
such as "Expires", "If-Modified-Since", "Last-Modified", etc.

This commit formats long dates into date Strings using the date format
recommended by the RFC and the GMT time zone.
This commit is contained in:
Brian Clozel
2015-07-21 14:28:44 +02:00
parent eef937e4f2
commit 088a50c1fb
4 changed files with 43 additions and 22 deletions

View File

@@ -23,12 +23,16 @@ import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
@@ -59,6 +63,10 @@ public class MockHttpServletResponse implements HttpServletResponse {
private static final String LOCATION_HEADER = "Location";
private static final String DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss zzz";
private static TimeZone GMT = TimeZone.getTimeZone("GMT");
//---------------------------------------------------------------------
// ServletResponse properties
@@ -481,12 +489,16 @@ public class MockHttpServletResponse implements HttpServletResponse {
@Override
public void setDateHeader(String name, long value) {
setHeaderValue(name, value);
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.US);
dateFormat.setTimeZone(GMT);
setHeaderValue(name, dateFormat.format(new Date(value)));
}
@Override
public void addDateHeader(String name, long value) {
addHeaderValue(name, value);
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.US);
dateFormat.setTimeZone(GMT);
setHeaderValue(name, dateFormat.format(new Date(value)));
}
@Override

View File

@@ -107,7 +107,7 @@ public class ServletWebRequestHttpMethodsTests {
assertTrue(request.checkNotModified(epochTime));
assertEquals(304, servletResponse.getStatus());
assertEquals("" + epochTime, servletResponse.getHeader("Last-Modified"));
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
}
@Test
@@ -118,7 +118,7 @@ public class ServletWebRequestHttpMethodsTests {
assertFalse(request.checkNotModified(currentDate.getTime()));
assertEquals(200, servletResponse.getStatus());
assertEquals("" + currentDate.getTime(), servletResponse.getHeader("Last-Modified"));
assertEquals(dateFormat.format(currentDate.getTime()), servletResponse.getHeader("Last-Modified"));
}
@Test
@@ -189,7 +189,7 @@ public class ServletWebRequestHttpMethodsTests {
assertEquals(304, servletResponse.getStatus());
assertEquals(eTag, servletResponse.getHeader("ETag"));
assertEquals("" + currentDate.getTime(), servletResponse.getHeader("Last-Modified"));
assertEquals(dateFormat.format(currentDate.getTime()), servletResponse.getHeader("Last-Modified"));
}
@Test
@@ -204,7 +204,7 @@ public class ServletWebRequestHttpMethodsTests {
assertEquals(200, servletResponse.getStatus());
assertEquals(eTag, servletResponse.getHeader("ETag"));
assertEquals("" + currentEpoch, servletResponse.getHeader("Last-Modified"));
assertEquals(dateFormat.format(currentEpoch), servletResponse.getHeader("Last-Modified"));
}
@Test
@@ -219,7 +219,7 @@ public class ServletWebRequestHttpMethodsTests {
assertEquals(200, servletResponse.getStatus());
assertEquals(currentETag, servletResponse.getHeader("ETag"));
assertEquals("" + epochTime, servletResponse.getHeader("Last-Modified"));
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
}
@Test
@@ -266,7 +266,7 @@ public class ServletWebRequestHttpMethodsTests {
assertTrue(request.checkNotModified(epochTime));
assertEquals(304, servletResponse.getStatus());
assertEquals("" + epochTime, servletResponse.getHeader("Last-Modified"));
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
}
@Test
@@ -278,7 +278,7 @@ public class ServletWebRequestHttpMethodsTests {
assertFalse(request.checkNotModified(epochTime));
assertEquals(200, servletResponse.getStatus());
assertEquals("" + epochTime, servletResponse.getHeader("Last-Modified"));
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
}
}