adjust to Java8 vs Java9 differences in timezones != pacific

Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/8526b85e
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/8526b85e
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/8526b85e

Branch: refs/heads/master
Commit: 8526b85e269b87187008b502692406a5ab1bb907
Parents: 8251cd6
Author: Stefan Bodewig <bode...@apache.org>
Authored: Tue Jul 4 10:49:47 2017 +0200
Committer: Stefan Bodewig <bode...@apache.org>
Committed: Tue Jul 4 10:49:47 2017 +0200

----------------------------------------------------------------------
 .../zip/X5455_ExtendedTimestampTest.java        | 79 +++++++++++++-------
 1 file changed, 53 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-compress/blob/8526b85e/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java
 
b/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java
index 40db766..97df90c 100644
--- 
a/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java
+++ 
b/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java
@@ -105,6 +105,12 @@ public class X5455_ExtendedTimestampTest {
         uses the extended time stamp field itself and should be the
         same as "mod time".
         http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/rev/90df6756406f
+
+        Starting with Java9 the parser for extended time stamps has
+        been fixed to use signed integers which was detected during
+        the triage of COMPRESS-416. Signed integers is the correct
+        format and Compress 1.15 has started to use signed integers as
+        well.
          */
 
         final File archive = getFile("COMPRESS-210_unix_time_zip_test.zip");
@@ -119,11 +125,37 @@ public class X5455_ExtendedTimestampTest {
             while (en.hasMoreElements()) {
 
                 final ZipArchiveEntry zae = en.nextElement();
+                if (zae.isDirectory()) {
+                    continue;
+                }
                 final String name = zae.getName();
+                final int x = name.lastIndexOf('/');
+                final String yearString = name.substring(x + 1);
+                int year;
+                try {
+                    year = Integer.parseInt(yearString);
+                } catch (final NumberFormatException nfe) {
+                    // setTime.sh, skip
+                    continue;
+                }
+
                 final X5455_ExtendedTimestamp xf = (X5455_ExtendedTimestamp) 
zae.getExtraField(X5455);
                 final Date rawZ = zae.getLastModifiedDate();
                 final Date m = xf.getModifyJavaTime();
-                final boolean zipTimeUsesExtendedTimestamp = rawZ.equals(m);
+
+                /*
+                  We must distinguish three cases:
+                  - Java has read the extended time field itself and agrees 
with us (Java9 or Java8 and years prior to
+                    2028)
+                  - Java has read the extended time field but found a year >= 
2038 (Java8)
+                  - Java hasn't read the extended time field at all (Java7- or 
early Java8)
+                */
+
+                final boolean zipTimeUsesExtendedTimestampCorrectly = 
rawZ.equals(m);
+                final boolean zipTimeUsesExtendedTimestampButUnsigned = year > 
2037 && rawZ.getSeconds() == 1;
+                final boolean zipTimeUsesExtendedTimestamp = 
zipTimeUsesExtendedTimestampCorrectly
+                    || zipTimeUsesExtendedTimestampButUnsigned;
+
                 final Date z = zipTimeUsesExtendedTimestamp ? rawZ : 
adjustFromGMTToExpectedOffset(rawZ);
                 final Date a = xf.getAccessJavaTime();
 
@@ -131,34 +163,29 @@ public class X5455_ExtendedTimestampTest {
                 final String modTime = DATE_FORMAT.format(m);
                 final String accTime = DATE_FORMAT.format(a);
 
-                if (!zae.isDirectory()) {
-                    final int x = name.lastIndexOf('/');
-                    final String yearString = name.substring(x + 1);
-                    int year;
-                    try {
-                        year = Integer.parseInt(yearString);
-                    } catch (final NumberFormatException nfe) {
-                        year = -1;
+                switch (year) {
+                case 2109:
+                    // All three timestamps have overflowed by 2109.
+                    if (!zipTimeUsesExtendedTimestamp) {
+                        assertEquals("1981-01-01/00:00:02 +0000", zipTime);
                     }
-                    if (year >= 0) {
-                        switch (year) {
-                            default:
-                                if (!zipTimeUsesExtendedTimestamp) {
-                                    // X5455 time is good from epoch (1970) to 
2037.
-                                    // Zip time is good from 1980 to 2107.
-                                    if (year < 1980) {
-                                        assertEquals("1980-01-01/08:00:00 
+0000", zipTime);
-                                    } else {
-                                        assertEquals(year + "-01-01/00:00:02 
+0000", zipTime);
-                                    }
-                                }
-                                if (year < 2038) {
-                                    assertEquals(year + "-01-01/00:00:01 
+0000", modTime);
-                                    assertEquals(year + "-01-01/00:00:03 
+0000", accTime);
-                                }
-                                break;
+                    break;
+                default:
+                    if (!zipTimeUsesExtendedTimestamp) {
+                        // X5455 time is good from epoch (1970) to 2037.
+                        // Zip time is good from 1980 to 2107.
+                        if (year < 1980) {
+                            assertEquals("1980-01-01/08:00:00 +0000", zipTime);
+                        } else {
+                            assertEquals(year + "-01-01/00:00:02 +0000", 
zipTime);
                         }
                     }
+
+                    if (year < 2038) {
+                        assertEquals(year + "-01-01/00:00:01 +0000", modTime);
+                        assertEquals(year + "-01-01/00:00:03 +0000", accTime);
+                    }
+                    break;
                 }
             }
         } finally {

Reply via email to