Skip to content

Commit 1fa8410

Browse files
committed
Leverage RFC_1123_DATE_TIME formatter in tests
Issue: SPR-15661
1 parent f790337 commit 1fa8410

File tree

5 files changed

+46
-53
lines changed

5 files changed

+46
-53
lines changed

spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@
2323
import java.io.PrintWriter;
2424
import java.io.UnsupportedEncodingException;
2525
import java.io.Writer;
26-
import java.text.ParseException;
27-
import java.text.SimpleDateFormat;
26+
import java.time.Instant;
27+
import java.time.ZoneId;
28+
import java.time.ZonedDateTime;
29+
import java.time.format.DateTimeParseException;
2830
import java.util.ArrayList;
2931
import java.util.Collection;
3032
import java.util.Collections;
31-
import java.util.Date;
3233
import java.util.List;
3334
import java.util.Locale;
3435
import java.util.Map;
35-
import java.util.TimeZone;
3636
import javax.servlet.ServletOutputStream;
3737
import javax.servlet.http.Cookie;
3838
import javax.servlet.http.HttpServletResponse;
@@ -44,6 +44,8 @@
4444
import org.springframework.util.StringUtils;
4545
import org.springframework.web.util.WebUtils;
4646

47+
import static java.time.format.DateTimeFormatter.*;
48+
4749
/**
4850
* Mock implementation of the {@link javax.servlet.http.HttpServletResponse} interface.
4951
*
@@ -58,9 +60,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
5860

5961
private static final String CHARSET_PREFIX = "charset=";
6062

61-
private static final String DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss zzz";
62-
63-
private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
63+
private static final ZoneId GMT = ZoneId.of("GMT");
6464

6565

6666
//---------------------------------------------------------------------
@@ -508,12 +508,10 @@ public void setDateHeader(String name, long value) {
508508
}
509509

510510
public long getDateHeader(String name) {
511-
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.US);
512-
dateFormat.setTimeZone(GMT);
513511
try {
514-
return dateFormat.parse(getHeader(name)).getTime();
512+
return ZonedDateTime.parse(getHeader(name), RFC_1123_DATE_TIME).toInstant().toEpochMilli();
515513
}
516-
catch (ParseException ex) {
514+
catch (DateTimeParseException ex) {
517515
throw new IllegalArgumentException(
518516
"Value for header '" + name + "' is not a valid Date: " + getHeader(name));
519517
}
@@ -525,9 +523,9 @@ public void addDateHeader(String name, long value) {
525523
}
526524

527525
private String formatDate(long date) {
528-
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.US);
529-
dateFormat.setTimeZone(GMT);
530-
return dateFormat.format(new Date(date));
526+
Instant instant = Instant.ofEpochMilli(date);
527+
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, GMT);
528+
return RFC_1123_DATE_TIME.format(zonedDateTime);
531529
}
532530

533531
@Override

spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestHttpMethodsTests.java

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616

1717
package org.springframework.web.context.request;
1818

19-
import java.text.SimpleDateFormat;
19+
import java.time.Instant;
20+
import java.time.ZoneId;
21+
import java.time.ZonedDateTime;
2022
import java.util.Arrays;
2123
import java.util.Date;
22-
import java.util.Locale;
23-
import java.util.TimeZone;
2424

2525
import org.junit.Before;
2626
import org.junit.Test;
@@ -32,6 +32,7 @@
3232
import org.springframework.mock.web.test.MockHttpServletRequest;
3333
import org.springframework.mock.web.test.MockHttpServletResponse;
3434

35+
import static java.time.format.DateTimeFormatter.*;
3536
import static org.junit.Assert.*;
3637

3738
/**
@@ -43,9 +44,9 @@
4344
@RunWith(Parameterized.class)
4445
public class ServletWebRequestHttpMethodsTests {
4546

46-
private static final String CURRENT_TIME = "Wed, 09 Apr 2014 09:57:42 GMT";
47+
private static final ZoneId GMT = ZoneId.of("GMT");
4748

48-
private SimpleDateFormat dateFormat;
49+
private static final String CURRENT_TIME = "Wed, 9 Apr 2014 09:57:42 GMT";
4950

5051
private MockHttpServletRequest servletRequest;
5152

@@ -70,8 +71,6 @@ static public Iterable<Object[]> safeMethods() {
7071
@Before
7172
public void setup() {
7273
currentDate = new Date();
73-
dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
74-
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
7574
servletRequest = new MockHttpServletRequest(method, "http://example.org");
7675
servletResponse = new MockHttpServletResponse();
7776
request = new ServletWebRequest(servletRequest, servletResponse);
@@ -127,7 +126,7 @@ public void checkNotModifiedTimestamp() throws Exception {
127126
assertTrue(request.checkNotModified(epochTime));
128127

129128
assertEquals(304, servletResponse.getStatus());
130-
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
129+
assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(epochTime).atZone(GMT)), servletResponse.getHeader("Last-Modified"));
131130
}
132131

133132
@Test
@@ -138,7 +137,7 @@ public void checkModifiedTimestamp() {
138137
assertFalse(request.checkNotModified(currentDate.getTime()));
139138

140139
assertEquals(200, servletResponse.getStatus());
141-
assertEquals(dateFormat.format(currentDate.getTime()), servletResponse.getHeader("Last-Modified"));
140+
assertEquals(RFC_1123_DATE_TIME.format(currentDate.toInstant().atZone(GMT)), servletResponse.getHeader("Last-Modified"));
142141
}
143142

144143
@Test
@@ -221,7 +220,7 @@ public void checkNotModifiedETagAndTimestamp() {
221220

222221
assertEquals(304, servletResponse.getStatus());
223222
assertEquals(eTag, servletResponse.getHeader("ETag"));
224-
assertEquals(dateFormat.format(currentDate.getTime()), servletResponse.getHeader("Last-Modified"));
223+
assertEquals(RFC_1123_DATE_TIME.format(currentDate.toInstant().atZone(GMT)), servletResponse.getHeader("Last-Modified"));
225224
}
226225

227226
@Test // SPR-14224
@@ -236,7 +235,7 @@ public void checkNotModifiedETagAndModifiedTimestamp() {
236235

237236
assertEquals(304, servletResponse.getStatus());
238237
assertEquals(eTag, servletResponse.getHeader("ETag"));
239-
assertEquals(dateFormat.format(currentEpoch), servletResponse.getHeader("Last-Modified"));
238+
assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(currentEpoch).atZone(GMT)), servletResponse.getHeader("Last-Modified"));
240239
}
241240

242241
@Test
@@ -251,7 +250,7 @@ public void checkModifiedETagAndNotModifiedTimestamp() throws Exception {
251250

252251
assertEquals(200, servletResponse.getStatus());
253252
assertEquals(currentETag, servletResponse.getHeader("ETag"));
254-
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
253+
assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(epochTime).atZone(GMT)), servletResponse.getHeader("Last-Modified"));
255254
}
256255

257256
@Test
@@ -291,26 +290,26 @@ public void checkNotModifiedMultipleETags() {
291290

292291
@Test
293292
public void checkNotModifiedTimestampWithLengthPart() throws Exception {
294-
long epochTime = dateFormat.parse(CURRENT_TIME).getTime();
293+
long epochTime = ZonedDateTime.parse(CURRENT_TIME, RFC_1123_DATE_TIME).toInstant().toEpochMilli();
295294
servletRequest.setMethod("GET");
296295
servletRequest.addHeader("If-Modified-Since", "Wed, 09 Apr 2014 09:57:42 GMT; length=13774");
297296

298297
assertTrue(request.checkNotModified(epochTime));
299298

300299
assertEquals(304, servletResponse.getStatus());
301-
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
300+
assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(epochTime).atZone(GMT)), servletResponse.getHeader("Last-Modified"));
302301
}
303302

304303
@Test
305304
public void checkModifiedTimestampWithLengthPart() throws Exception {
306-
long epochTime = dateFormat.parse(CURRENT_TIME).getTime();
305+
long epochTime = ZonedDateTime.parse(CURRENT_TIME, RFC_1123_DATE_TIME).toInstant().toEpochMilli();
307306
servletRequest.setMethod("GET");
308307
servletRequest.addHeader("If-Modified-Since", "Wed, 08 Apr 2014 09:57:42 GMT; length=13774");
309308

310309
assertFalse(request.checkNotModified(epochTime));
311310

312311
assertEquals(200, servletResponse.getStatus());
313-
assertEquals(dateFormat.format(epochTime), servletResponse.getHeader("Last-Modified"));
312+
assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(epochTime).atZone(GMT)), servletResponse.getHeader("Last-Modified"));
314313
}
315314

316315
@Test

spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ public void localeRequest() throws Exception {
178178
MockHttpServletResponse response = new MockHttpServletResponse();
179179
simpleDispatcherServlet.service(request, response);
180180
assertTrue("Not forwarded", response.getForwardedUrl() == null);
181-
assertEquals("Wed, 01 Apr 2015 00:00:00 GMT", response.getHeader("Last-Modified"));
181+
assertEquals("Wed, 1 Apr 2015 00:00:00 GMT", response.getHeader("Last-Modified"));
182182
}
183183

184184
@Test
@@ -208,7 +208,7 @@ public void anotherLocaleRequest() throws Exception {
208208
assertTrue(request.getAttribute("test3") != null);
209209
assertTrue(request.getAttribute("test3x") != null);
210210
assertTrue(request.getAttribute("test3y") != null);
211-
assertEquals("Wed, 01 Apr 2015 00:00:01 GMT", response.getHeader("Last-Modified"));
211+
assertEquals("Wed, 1 Apr 2015 00:00:01 GMT", response.getHeader("Last-Modified"));
212212
}
213213

214214
@Test

spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,11 @@
1919
import java.lang.reflect.Method;
2020
import java.net.URI;
2121
import java.nio.charset.StandardCharsets;
22-
import java.text.SimpleDateFormat;
22+
import java.time.ZoneId;
2323
import java.util.ArrayList;
2424
import java.util.Collections;
2525
import java.util.Date;
2626
import java.util.List;
27-
import java.util.Locale;
28-
import java.util.TimeZone;
2927

3028
import org.junit.Before;
3129
import org.junit.Rule;
@@ -54,6 +52,8 @@
5452
import org.springframework.web.context.request.ServletWebRequest;
5553
import org.springframework.web.method.support.ModelAndViewContainer;
5654

55+
import static java.time.Instant.*;
56+
import static java.time.format.DateTimeFormatter.*;
5757
import static org.junit.Assert.*;
5858
import static org.mockito.BDDMockito.*;
5959
import static org.springframework.web.servlet.HandlerMapping.*;
@@ -70,11 +70,12 @@
7070
*/
7171
public class HttpEntityMethodProcessorMockTests {
7272

73+
private static final ZoneId GMT = ZoneId.of("GMT");
74+
75+
7376
@Rule
7477
public ExpectedException thrown = ExpectedException.none();
7578

76-
private SimpleDateFormat dateFormat;
77-
7879
private HttpEntityMethodProcessor processor;
7980

8081
private HttpMessageConverter<String> stringHttpMessageConverter;
@@ -113,8 +114,6 @@ public class HttpEntityMethodProcessorMockTests {
113114
@Before
114115
@SuppressWarnings("unchecked")
115116
public void setup() throws Exception {
116-
dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
117-
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
118117

119118
stringHttpMessageConverter = mock(HttpMessageConverter.class);
120119
given(stringHttpMessageConverter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.TEXT_PLAIN));
@@ -350,7 +349,7 @@ public void shouldHandleResponseHeaderAndBody() throws Exception {
350349
public void shouldHandleLastModifiedWithHttp304() throws Exception {
351350
long currentTime = new Date().getTime();
352351
long oneMinuteAgo = currentTime - (1000 * 60);
353-
servletRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, dateFormat.format(currentTime));
352+
servletRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, RFC_1123_DATE_TIME.format(ofEpochMilli(currentTime).atZone(GMT)));
354353
ResponseEntity<String> returnValue = ResponseEntity.ok().lastModified(oneMinuteAgo).body("body");
355354

356355
initStringMessageConversion(MediaType.TEXT_PLAIN);
@@ -388,7 +387,7 @@ public void shouldHandleETagAndLastModifiedWithHttp304() throws Exception {
388387
long currentTime = new Date().getTime();
389388
long oneMinuteAgo = currentTime - (1000 * 60);
390389
String etagValue = "\"deadb33f8badf00d\"";
391-
servletRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, dateFormat.format(currentTime));
390+
servletRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, RFC_1123_DATE_TIME.format(ofEpochMilli(currentTime).atZone(GMT)));
392391
servletRequest.addHeader(HttpHeaders.IF_NONE_MATCH, etagValue);
393392
ResponseEntity<String> returnValue = ResponseEntity.ok().eTag(etagValue).lastModified(oneMinuteAgo).body("body");
394393

@@ -418,7 +417,7 @@ public void shouldHandleChangedETagAndLastModified() throws Exception {
418417
long oneMinuteAgo = currentTime - (1000 * 60);
419418
String etagValue = "\"deadb33f8badf00d\"";
420419
String changedEtagValue = "\"changed-etag-value\"";
421-
servletRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, dateFormat.format(currentTime));
420+
servletRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, RFC_1123_DATE_TIME.format(ofEpochMilli(currentTime).atZone(GMT)));
422421
servletRequest.addHeader(HttpHeaders.IF_NONE_MATCH, etagValue);
423422
ResponseEntity<String> returnValue = ResponseEntity.ok()
424423
.eTag(changedEtagValue).lastModified(oneMinuteAgo).body("body");
@@ -473,7 +472,7 @@ public void shouldHandleIfNoneMatchIfMatch() throws Exception {
473472
public void shouldHandleIfNoneMatchIfUnmodifiedSince() throws Exception {
474473
String etagValue = "\"some-etag\"";
475474
servletRequest.addHeader(HttpHeaders.IF_NONE_MATCH, etagValue);
476-
servletRequest.addHeader(HttpHeaders.IF_UNMODIFIED_SINCE, dateFormat.format(new Date().getTime()));
475+
servletRequest.addHeader(HttpHeaders.IF_UNMODIFIED_SINCE, RFC_1123_DATE_TIME.format(ofEpochMilli(new Date().getTime()).atZone(GMT)));
477476
ResponseEntity<String> returnValue = ResponseEntity.ok().eTag(etagValue).body("body");
478477

479478
initStringMessageConversion(MediaType.TEXT_PLAIN);
@@ -538,7 +537,7 @@ private void assertConditionalResponse(HttpStatus status, String body,
538537
}
539538
if (lastModified != -1) {
540539
assertEquals(1, servletResponse.getHeaderValues(HttpHeaders.LAST_MODIFIED).size());
541-
assertEquals(dateFormat.format(lastModified), servletResponse.getHeader(HttpHeaders.LAST_MODIFIED));
540+
assertEquals(RFC_1123_DATE_TIME.format(ofEpochMilli(lastModified).atZone(GMT)), servletResponse.getHeader(HttpHeaders.LAST_MODIFIED));
542541
}
543542
}
544543

spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
package org.springframework.web.servlet.resource;
1818

1919
import java.io.IOException;
20-
import java.text.SimpleDateFormat;
20+
import java.time.Instant;
21+
import java.time.ZoneId;
22+
import java.time.ZonedDateTime;
2123
import java.util.ArrayList;
2224
import java.util.Arrays;
2325
import java.util.Collections;
2426
import java.util.List;
25-
import java.util.Locale;
26-
import java.util.TimeZone;
2727
import javax.servlet.http.HttpServletResponse;
2828

2929
import org.hamcrest.Matchers;
@@ -45,6 +45,7 @@
4545
import org.springframework.web.accept.ContentNegotiationManagerFactoryBean;
4646
import org.springframework.web.servlet.HandlerMapping;
4747

48+
import static java.time.format.DateTimeFormatter.*;
4849
import static org.junit.Assert.assertEquals;
4950
import static org.junit.Assert.assertSame;
5051
import static org.junit.Assert.assertThat;
@@ -61,8 +62,6 @@
6162
*/
6263
public class ResourceHttpRequestHandlerTests {
6364

64-
private SimpleDateFormat dateFormat;
65-
6665
private ResourceHttpRequestHandler handler;
6766

6867
private MockHttpServletRequest request;
@@ -72,8 +71,6 @@ public class ResourceHttpRequestHandlerTests {
7271

7372
@Before
7473
public void setUp() throws Exception {
75-
dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
76-
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
7774

7875
List<Resource> paths = new ArrayList<>(2);
7976
paths.add(new ClassPathResource("test/", getClass()));
@@ -623,7 +620,7 @@ public void doOverwriteExistingCacheControlHeaders() throws Exception {
623620

624621

625622
private long dateHeaderAsLong(String responseHeaderName) throws Exception {
626-
return dateFormat.parse(this.response.getHeader(responseHeaderName)).getTime();
623+
return ZonedDateTime.parse(this.response.getHeader(responseHeaderName), RFC_1123_DATE_TIME).toInstant().toEpochMilli();
627624
}
628625

629626
private long resourceLastModified(String resourceName) throws IOException {
@@ -632,7 +629,7 @@ private long resourceLastModified(String resourceName) throws IOException {
632629

633630
private String resourceLastModifiedDate(String resourceName) throws IOException {
634631
long lastModified = new ClassPathResource(resourceName, getClass()).getFile().lastModified();
635-
return dateFormat.format(lastModified);
632+
return RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(lastModified).atZone(ZoneId.of("GMT")));
636633
}
637634

638635

0 commit comments

Comments
 (0)