/* * Copyright 2010-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://aws.amazon.com/apache2.0 * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES * OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and * limitations under the License. */ package com.amazonaws.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.ISODateTimeFormat; import org.joda.time.tz.FixedDateTimeZone; import org.junit.Ignore; import org.junit.Test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.SimpleTimeZone; public class DateUtilsTest { private static final boolean DEBUG = false; private final DateTimeZone GMT = new FixedDateTimeZone("GMT", "GMT", 0, 0); private final DateTimeFormatter iso8601DateFormat = ISODateTimeFormat.dateTime().withZone(GMT); private final DateTimeFormatter alternateIso8601DateFormat = DateTimeFormat.forPattern(DateUtils.ALTERNATE_ISO8601_DATE_PATTERN).withZone(GMT); private final DateTimeFormatter rfc822DateFormat = DateTimeFormat.forPattern(DateUtils.RFC822_DATE_PATTERN) .withLocale(Locale.US) .withZone(GMT); private final DateTimeFormatter compressedIso8601DateFormat = DateTimeFormat.forPattern(DateUtils.COMPRESSED_DATE_PATTERN) .withZone(GMT); @Test public void tt0031561767() throws ParseException { String input = "Fri, 16 May 2014 23:56:46 GMT"; Date date = DateUtils.parseRFC822Date(input); assertEquals(input, DateUtils.formatRFC822Date(date)); } @Test public void testIso8601Date() { Date date = new Date(); String expected = iso8601DateFormat.print(date.getTime()); String actual = DateUtils.formatISO8601Date(date); assertEquals(expected, actual); Date expectedDate = new Date(iso8601DateFormat.parseMillis(expected)); Date actualDate = DateUtils.parseISO8601Date(actual); assertEquals(expectedDate, actualDate); } @Ignore("Joda has issue handling format string 'z'") @Test public void testRfc822Date() { Date date = new Date(); String expected = rfc822DateFormat.print(date.getTime()); String actual = DateUtils.formatRFC822Date(date); assertEquals(expected, actual); Date expectedDate = new Date(rfc822DateFormat.parseMillis(expected)); Date actualDate = DateUtils.parseRFC822Date(actual); assertEquals(expectedDate, actualDate); } @Test public void testCompressedIso8601Date() throws ParseException { Date date = new Date(); String formatted = compressedIso8601DateFormat.print(date.getTime()); Date expected = new Date(compressedIso8601DateFormat.parseMillis(formatted)); Date actual = DateUtils.parseCompressedISO8601Date(formatted); assertEquals(expected, actual); } @Test public void testAlternativeIso8601Date() throws ParseException { Date date = new Date(); String formatted = alternateIso8601DateFormat.print(date.getTime()); Date expectedDate = new Date(alternateIso8601DateFormat.parseMillis(formatted)); Date actualDate = DateUtils.parseISO8601Date(formatted); assertEquals(expectedDate, actualDate); } @Test(expected = IllegalArgumentException.class) public void invalidDate() throws ParseException { final String input = "2014-03-06T14:28:58.000 Z"; System.out.println(DateUtils.parseISO8601Date(input)); } @Test public void testIssue233() throws ParseException { // https://github.com/aws/aws-sdk-java/issues/233 final String edgeCase = "292278994-08-17T07:12:55.807Z"; Date expected = DateUtils.parseISO8601Date(edgeCase); String formatted = DateUtils.formatISO8601Date(expected); if (DEBUG) System.out.println("formatted: " + formatted); assertEquals(edgeCase, formatted); Date parsed = DateUtils.parseISO8601Date(edgeCase); if (DEBUG) System.out.println("parsed: " + parsed); assertEquals(expected, parsed); } @Test public void testIssue233JodaTimeLimit() throws ParseException { // https://github.com/aws/aws-sdk-java/issues/233 String s = DateUtils.formatISO8601Date(new Date(Long.MAX_VALUE)); System.out.println("s: " + s); Date date = DateUtils.parseISO8601Date(s); System.out.println("date: " + date); } @Test public void testIssueDaysDiff() throws ParseException { // https://github.com/aws/aws-sdk-java/issues/233 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); sdf.setTimeZone(new SimpleTimeZone(0, "GMT")); String edgeCase = "292278994-08-17T07:12:55.807Z"; String testCase = "292278993-08-17T07:12:55.807Z"; Date od = DateUtils.parseISO8601Date(edgeCase); Date testd = DateUtils.parseISO8601Date(testCase); long diff = od.getTime() - testd.getTime(); assertTrue(diff == 365L * 24 * 60 * 60 * 1000); } @Test public void testIssue233Overflows() throws ParseException { String[] cases = { // 1 milli second passed the max time "292278994-08-17T07:12:55.808Z", // 1 year passed the max year "292278995-01-17T07:12:55.807Z", }; for (String edgeCase : cases) { try { Date parsed = DateUtils.parseISO8601Date(edgeCase); System.out.println("date: " + parsed); fail("Unexpected success: " + parsed); } catch (IllegalArgumentException ex) { assertTrue(ex.getCause() instanceof ParseException); } } } }