test/java/util/zip/TestExtraTime.java
Print this page
*** 21,39 ****
* questions.
*/
/**
* @test
! * @bug 4759491 6303183 7012868 8015666
* @summary Test ZOS and ZIS timestamp in extra field correctly
*/
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileTime;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
--- 21,40 ----
* questions.
*/
/**
* @test
! * @bug 4759491 6303183 7012868 8015666 8023713
* @summary Test ZOS and ZIS timestamp in extra field correctly
*/
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileTime;
+ import java.util.Arrays;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
*** 50,120 ****
FileTime mtime = FileTime.from(time, TimeUnit.MILLISECONDS);
FileTime atime = FileTime.from(time + 300000, TimeUnit.MILLISECONDS);
FileTime ctime = FileTime.from(time - 300000, TimeUnit.MILLISECONDS);
TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
! test(mtime, null, null, null);
// ms-dos 1980 epoch problem
! test(FileTime.from(10, TimeUnit.MILLISECONDS), null, null, null);
// non-default tz
! test(mtime, null, null, tz);
! test(mtime, atime, null, null);
! test(mtime, null, ctime, null);
! test(mtime, atime, ctime, null);
!
! test(mtime, atime, null, tz);
! test(mtime, null, ctime, tz);
! test(mtime, atime, ctime, tz);
}
}
static void test(FileTime mtime, FileTime atime, FileTime ctime,
! TimeZone tz) throws Throwable {
System.out.printf("--------------------%nTesting: [%s]/[%s]/[%s]%n",
mtime, atime, ctime);
TimeZone tz0 = TimeZone.getDefault();
if (tz != null) {
TimeZone.setDefault(tz);
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
! ZipEntry ze = new ZipEntry("TestExtreTime.java");
!
ze.setLastModifiedTime(mtime);
if (atime != null)
ze.setLastAccessTime(atime);
if (ctime != null)
ze.setCreationTime(ctime);
zos.putNextEntry(ze);
zos.write(new byte[] { 1,2 ,3, 4});
zos.close();
if (tz != null) {
TimeZone.setDefault(tz0);
}
// ZipInputStream
ZipInputStream zis = new ZipInputStream(
new ByteArrayInputStream(baos.toByteArray()));
ze = zis.getNextEntry();
zis.close();
! check(mtime, atime, ctime, ze);
// ZipFile
Path zpath = Paths.get(System.getProperty("test.dir", "."),
! "TestExtraTimp.zip");
Files.copy(new ByteArrayInputStream(baos.toByteArray()), zpath);
ZipFile zf = new ZipFile(zpath.toFile());
! ze = zf.getEntry("TestExtreTime.java");
// ZipFile read entry from cen, which does not have a/ctime,
// for now.
! check(mtime, null, null, ze);
zf.close();
Files.delete(zpath);
}
static void check(FileTime mtime, FileTime atime, FileTime ctime,
! ZipEntry ze) {
/*
System.out.printf(" mtime [%tc]: [%tc]/[%tc]%n",
mtime.to(TimeUnit.MILLISECONDS),
ze.getTime(),
ze.getLastModifiedTime().to(TimeUnit.MILLISECONDS));
--- 51,131 ----
FileTime mtime = FileTime.from(time, TimeUnit.MILLISECONDS);
FileTime atime = FileTime.from(time + 300000, TimeUnit.MILLISECONDS);
FileTime ctime = FileTime.from(time - 300000, TimeUnit.MILLISECONDS);
TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
! for (byte[] extra : new byte[][] { null, new byte[] {1, 2, 3}}) {
! test(mtime, null, null, null, extra);
// ms-dos 1980 epoch problem
! test(FileTime.from(10, TimeUnit.MILLISECONDS), null, null, null, extra);
// non-default tz
! test(mtime, null, null, tz, extra);
! test(mtime, atime, null, null, extra);
! test(mtime, null, ctime, null, extra);
! test(mtime, atime, ctime, null, extra);
!
! test(mtime, atime, null, tz, extra);
! test(mtime, null, ctime, tz, extra);
! test(mtime, atime, ctime, tz, extra);
! }
}
}
static void test(FileTime mtime, FileTime atime, FileTime ctime,
! TimeZone tz, byte[] extra) throws Throwable {
System.out.printf("--------------------%nTesting: [%s]/[%s]/[%s]%n",
mtime, atime, ctime);
TimeZone tz0 = TimeZone.getDefault();
if (tz != null) {
TimeZone.setDefault(tz);
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
! ZipEntry ze = new ZipEntry("TestExtraTime.java");
! ze.setExtra(extra);
ze.setLastModifiedTime(mtime);
if (atime != null)
ze.setLastAccessTime(atime);
if (ctime != null)
ze.setCreationTime(ctime);
zos.putNextEntry(ze);
zos.write(new byte[] { 1,2 ,3, 4});
+
+ // append an extra entry to help check if the length and data
+ // of the extra field are being correctly written (in previous
+ // entry).
+ if (extra != null) {
+ ze = new ZipEntry("TestExtraEntry");
+ zos.putNextEntry(ze);
+ }
zos.close();
if (tz != null) {
TimeZone.setDefault(tz0);
}
// ZipInputStream
ZipInputStream zis = new ZipInputStream(
new ByteArrayInputStream(baos.toByteArray()));
ze = zis.getNextEntry();
zis.close();
! check(mtime, atime, ctime, ze, extra);
// ZipFile
Path zpath = Paths.get(System.getProperty("test.dir", "."),
! "TestExtraTime.zip");
Files.copy(new ByteArrayInputStream(baos.toByteArray()), zpath);
ZipFile zf = new ZipFile(zpath.toFile());
! ze = zf.getEntry("TestExtraTime.java");
// ZipFile read entry from cen, which does not have a/ctime,
// for now.
! check(mtime, null, null, ze, extra);
zf.close();
Files.delete(zpath);
}
static void check(FileTime mtime, FileTime atime, FileTime ctime,
! ZipEntry ze, byte[] extra) {
/*
System.out.printf(" mtime [%tc]: [%tc]/[%tc]%n",
mtime.to(TimeUnit.MILLISECONDS),
ze.getTime(),
ze.getLastModifiedTime().to(TimeUnit.MILLISECONDS));
*** 128,134 ****
--- 139,157 ----
throw new RuntimeException("Timestamp: storing atime failed!");
if (ctime != null &&
ctime.to(TimeUnit.SECONDS) !=
ze.getCreationTime().to(TimeUnit.SECONDS))
throw new RuntimeException("Timestamp: storing ctime failed!");
+ if (extra != null) {
+ // if extra data exists, the current implementation put it at
+ // the end of the extra data array (implementation detail)
+ byte[] extra1 = ze.getExtra();
+ if (extra1 == null || extra1.length < extra.length ||
+ !Arrays.equals(Arrays.copyOfRange(extra1,
+ extra1.length - extra.length,
+ extra1.length),
+ extra)) {
+ throw new RuntimeException("Timestamp: storing extra field failed!");
+ }
+ }
}
}