8155616: java/util/zip/TestLocalTime.java fails intermittently with storing mtime failed
authorsherman
Tue, 19 Jul 2016 09:31:59 -0700
changeset 39746 e3a56c19a668
parent 39745 017b6227091d
child 39747 2d542b973871
8155616: java/util/zip/TestLocalTime.java fails intermittently with storing mtime failed Reviewed-by: rriggs
jdk/test/java/util/zip/TestLocalTime.java
--- a/jdk/test/java/util/zip/TestLocalTime.java	Tue Jul 19 16:36:09 2016 +0200
+++ b/jdk/test/java/util/zip/TestLocalTime.java	Tue Jul 19 09:31:59 2016 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 8075526 8135108
+ * @bug 8075526 8135108 8155616
  * @summary Test timestamp via ZipEntry.get/setTimeLocal()
  */
 
@@ -39,14 +39,13 @@
     public static void main(String[] args) throws Throwable{
         try {
             LocalDateTime ldt = LocalDateTime.now();
-            test(getBytes(ldt), ldt);    // now
-
-            ldt = ldt.withYear(1968); test(getBytes(ldt), ldt);
-            ldt = ldt.withYear(1970); test(getBytes(ldt), ldt);
-            ldt = ldt.withYear(1982); test(getBytes(ldt), ldt);
-            ldt = ldt.withYear(2037); test(getBytes(ldt), ldt);
-            ldt = ldt.withYear(2100); test(getBytes(ldt), ldt);
-            ldt = ldt.withYear(2106); test(getBytes(ldt), ldt);
+            test(ldt);    // now
+            test(ldt.withYear(1968));
+            test(ldt.withYear(1970));
+            test(ldt.withYear(1982));
+            test(ldt.withYear(2037));
+            test(ldt.withYear(2100));
+            test(ldt.withYear(2106));
 
             TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
             // dos time does not support < 1980, have to use
@@ -57,10 +56,14 @@
             testWithTZ(tz, ldt.withYear(2106));
 
             // for #8135108
-            ldt = LocalDateTime.of(2100, 12, 06, 12, 34, 34, 973);
-            test(getBytes(ldt), ldt);
-            ldt = LocalDateTime.of(2106, 12, 06, 12, 34, 34, 973);
-            test(getBytes(ldt), ldt);
+            test(LocalDateTime.of(2100, 12, 06, 12, 34, 34, 973));
+            test(LocalDateTime.of(2106, 12, 06, 12, 34, 34, 973));
+
+            // for #8155616
+            test(LocalDateTime.of(2016, 03, 13, 2, 50, 00));  // gap
+            test(LocalDateTime.of(2015, 11, 1,  1, 30, 00));  // overlap
+            test(LocalDateTime.of(1968, 04, 28, 2, 51, 25));
+            test(LocalDateTime.of(1970, 04, 26, 2, 31, 52));
 
         } finally {
             TimeZone.setDefault(tz0);
@@ -73,7 +76,6 @@
         ZipEntry ze = new ZipEntry("TestLocalTime.java");
         ze.setTimeLocal(mtime);
         check(ze, mtime);
-
         zos.putNextEntry(ze);
         zos.write(new byte[] { 1, 2, 3, 4});
         zos.close();
@@ -87,6 +89,10 @@
        test(zbytes, ldt);
     }
 
+    static void test(LocalDateTime ldt) throws Throwable {
+        test(getBytes(ldt), ldt);
+    }
+
     static void test(byte[] zbytes, LocalDateTime expected) throws Throwable {
         System.out.printf("--------------------%nTesting: [%s]%n", expected);
         // ZipInputStream
@@ -113,6 +119,23 @@
         LocalDateTime ldt = ze.getTimeLocal();
         if (ldt.atOffset(ZoneOffset.UTC).toEpochSecond() >> 1
             != expected.atOffset(ZoneOffset.UTC).toEpochSecond() >> 1) {
+            // if the LDT is out of the range of the standard ms-dos date-time
+            // format ( < 1980 ) AND the date-time is within the daylight saving
+            // time gap (which means the LDT is actually "invalid"), the LDT will
+            // be adjusted accordingly when ZipEntry.setTimeLocal() converts the
+            // date-time via ldt -> zdt -> Instant -> FileTime.
+            // See ZonedDateTime.of(LocalDateTime, ZoneId) for more details.
+            if (ldt.getYear() < 1980 || ldt.getYear() > (1980 + 0x7f)) {
+                System.out.println(" Non-MSDOS    ldt : " + ldt);
+                System.out.println("         expected : " + expected);
+                // try to adjust the "expected", assume daylight saving gap
+                expected = ZonedDateTime.of(expected, ZoneId.systemDefault())
+                                        .toLocalDateTime();
+                if (ldt.atOffset(ZoneOffset.UTC).toEpochSecond() >> 1
+                    == expected.atOffset(ZoneOffset.UTC).toEpochSecond() >> 1) {
+                    return;
+                }
+            }
             throw new RuntimeException("Timestamp: storing mtime failed!");
         }
     }