diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java index 937209957d..7898f35a22 100644 --- a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java +++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java @@ -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 diff --git a/spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestHttpMethodsTests.java b/spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestHttpMethodsTests.java index 371f5e9884..0d615a7e46 100644 --- a/spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestHttpMethodsTests.java +++ b/spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestHttpMethodsTests.java @@ -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")); } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java index e7e17c7f4f..1ef593c8a5 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java @@ -177,7 +177,7 @@ public class DispatcherServletTests extends TestCase { MockHttpServletResponse response = new MockHttpServletResponse(); simpleDispatcherServlet.service(request, response); assertTrue("Not forwarded", response.getForwardedUrl() == null); - assertEquals("1427846400000", response.getHeader("Last-Modified")); + assertEquals("Wed, 01 Apr 2015 00:00:00 GMT", response.getHeader("Last-Modified")); } public void testUnknownRequest() throws Exception { @@ -205,7 +205,7 @@ public class DispatcherServletTests extends TestCase { assertTrue(request.getAttribute("test3") != null); assertTrue(request.getAttribute("test3x") != null); assertTrue(request.getAttribute("test3y") != null); - assertEquals("1427846401000", response.getHeader("Last-Modified")); + assertEquals("Wed, 01 Apr 2015 00:00:01 GMT", response.getHeader("Last-Modified")); } public void testExistingMultipartRequest() throws Exception { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java index 7e5e0a6193..f85c4cd9ce 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java @@ -26,7 +26,6 @@ import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -56,6 +55,8 @@ import org.springframework.web.servlet.HandlerMapping; */ public class ResourceHttpRequestHandlerTests { + private SimpleDateFormat dateFormat; + private ResourceHttpRequestHandler handler; private MockHttpServletRequest request; @@ -65,6 +66,9 @@ public class ResourceHttpRequestHandlerTests { @Before public void setUp() throws Exception { + dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); + dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + List paths = new ArrayList<>(2); paths.add(new ClassPathResource("test/", getClass())); paths.add(new ClassPathResource("testalternatepath/", getClass())); @@ -89,7 +93,7 @@ public class ResourceHttpRequestHandlerTests { assertEquals(17, this.response.getContentLength()); assertEquals("max-age=3600", this.response.getHeader("Cache-Control")); assertTrue(this.response.containsHeader("Last-Modified")); - assertEquals(headerAsLong("Last-Modified") / 1000, resourceLastModified("test/foo.css") / 1000); + assertEquals(this.response.getHeader("Last-Modified"), resourceLastModifiedDate("test/foo.css")); assertEquals("h1 { color:red; }", this.response.getContentAsString()); } @@ -101,7 +105,7 @@ public class ResourceHttpRequestHandlerTests { assertEquals("no-store", this.response.getHeader("Cache-Control")); assertTrue(this.response.containsHeader("Last-Modified")); - assertEquals(headerAsLong("Last-Modified") / 1000, resourceLastModified("test/foo.css") / 1000); + assertEquals(this.response.getHeader("Last-Modified"), resourceLastModifiedDate("test/foo.css")); } @Test @@ -115,9 +119,9 @@ public class ResourceHttpRequestHandlerTests { this.handler.handleRequest(this.request, this.response); assertEquals("max-age=3600, must-revalidate", this.response.getHeader("Cache-Control")); - assertTrue(headerAsLong("Expires") >= System.currentTimeMillis() - 1000 + (3600 * 1000)); + assertTrue(dateHeaderAsLong("Expires") >= System.currentTimeMillis() - 1000 + (3600 * 1000)); assertTrue(this.response.containsHeader("Last-Modified")); - assertEquals(headerAsLong("Last-Modified") / 1000, resourceLastModified("test/foo.css") / 1000); + assertEquals(this.response.getHeader("Last-Modified"), resourceLastModifiedDate("test/foo.css")); } @Test @@ -131,9 +135,9 @@ public class ResourceHttpRequestHandlerTests { assertEquals("no-cache", this.response.getHeader("Pragma")); assertThat(this.response.getHeaderValues("Cache-Control"), Matchers.contains("no-cache", "no-store")); - assertTrue(headerAsLong("Expires") <= System.currentTimeMillis()); + assertTrue(dateHeaderAsLong("Expires") <= System.currentTimeMillis()); assertTrue(this.response.containsHeader("Last-Modified")); - assertEquals(headerAsLong("Last-Modified") / 1000, resourceLastModified("test/foo.css") / 1000); + assertEquals(dateHeaderAsLong("Last-Modified") / 1000, resourceLastModified("test/foo.css") / 1000); } @Test @@ -144,7 +148,7 @@ public class ResourceHttpRequestHandlerTests { assertEquals("text/html", this.response.getContentType()); assertEquals("max-age=3600", this.response.getHeader("Cache-Control")); assertTrue(this.response.containsHeader("Last-Modified")); - assertEquals(headerAsLong("Last-Modified") / 1000, resourceLastModified("test/foo.html") / 1000); + assertEquals(this.response.getHeader("Last-Modified"), resourceLastModifiedDate("test/foo.html")); } @Test @@ -156,7 +160,7 @@ public class ResourceHttpRequestHandlerTests { assertEquals(17, this.response.getContentLength()); assertEquals("max-age=3600", this.response.getHeader("Cache-Control")); assertTrue(this.response.containsHeader("Last-Modified")); - assertEquals(headerAsLong("Last-Modified") / 1000, resourceLastModified("testalternatepath/baz.css") / 1000); + assertEquals(this.response.getHeader("Last-Modified"), resourceLastModifiedDate("testalternatepath/baz.css")); assertEquals("h1 { color:red; }", this.response.getContentAsString()); } @@ -471,14 +475,19 @@ public class ResourceHttpRequestHandlerTests { } - private long headerAsLong(String responseHeaderName) throws Exception { - return Long.valueOf(this.response.getHeader(responseHeaderName)); + private long dateHeaderAsLong(String responseHeaderName) throws Exception { + return dateFormat.parse(this.response.getHeader(responseHeaderName)).getTime(); } private long resourceLastModified(String resourceName) throws IOException { return new ClassPathResource(resourceName, getClass()).getFile().lastModified(); } + private String resourceLastModifiedDate(String resourceName) throws IOException { + long lastModified = new ClassPathResource(resourceName, getClass()).getFile().lastModified(); + return dateFormat.format(lastModified); + } + private static class TestServletContext extends MockServletContext {