]> Cypherpunks repositories - gostls13.git/commitdiff
archive/zip: add test for Modified vs ModTime behavior
authorRuss Cox <rsc@golang.org>
Wed, 29 Nov 2017 16:40:52 +0000 (11:40 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 1 Dec 2017 00:22:21 +0000 (00:22 +0000)
Lock in fix for #22738, submitted in CL 78031.

Fixes #22738.

Change-Id: I6896feb158569e3f12fa7055387cbd7caad29ef4
Reviewed-on: https://go-review.googlesource.com/80635
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
src/archive/zip/reader_test.go
src/archive/zip/testdata/time-22738.zip [new file with mode: 0644]
src/archive/zip/writer_test.go

index 5fa2c80afa92408cfe8543c147d8548e6b4a5317..0d9040f76740c0e913117296ee0e19ffe6117c36 100644 (file)
@@ -27,10 +27,11 @@ type ZipTest struct {
 }
 
 type ZipTestFile struct {
-       Name    string
-       Mode    os.FileMode
-       NonUTF8 bool
-       ModTime time.Time
+       Name     string
+       Mode     os.FileMode
+       NonUTF8  bool
+       ModTime  time.Time
+       Modified time.Time
 
        // Information describing expected zip file content.
        // First, reading the entire content should produce the error ContentErr.
@@ -54,16 +55,16 @@ var tests = []ZipTest{
                Comment: "This is a zipfile comment.",
                File: []ZipTestFile{
                        {
-                               Name:    "test.txt",
-                               Content: []byte("This is a test text file.\n"),
-                               ModTime: time.Date(2010, 9, 5, 12, 12, 1, 0, timeZone(+10*time.Hour)),
-                               Mode:    0644,
+                               Name:     "test.txt",
+                               Content:  []byte("This is a test text file.\n"),
+                               Modified: time.Date(2010, 9, 5, 12, 12, 1, 0, timeZone(+10*time.Hour)),
+                               Mode:     0644,
                        },
                        {
-                               Name:    "gophercolor16x16.png",
-                               File:    "gophercolor16x16.png",
-                               ModTime: time.Date(2010, 9, 5, 15, 52, 58, 0, timeZone(+10*time.Hour)),
-                               Mode:    0644,
+                               Name:     "gophercolor16x16.png",
+                               File:     "gophercolor16x16.png",
+                               Modified: time.Date(2010, 9, 5, 15, 52, 58, 0, timeZone(+10*time.Hour)),
+                               Mode:     0644,
                        },
                },
        },
@@ -72,16 +73,16 @@ var tests = []ZipTest{
                Comment: "This is a zipfile comment.",
                File: []ZipTestFile{
                        {
-                               Name:    "test.txt",
-                               Content: []byte("This is a test text file.\n"),
-                               ModTime: time.Date(2010, 9, 5, 12, 12, 1, 0, timeZone(+10*time.Hour)),
-                               Mode:    0644,
+                               Name:     "test.txt",
+                               Content:  []byte("This is a test text file.\n"),
+                               Modified: time.Date(2010, 9, 5, 12, 12, 1, 0, timeZone(+10*time.Hour)),
+                               Mode:     0644,
                        },
                        {
-                               Name:    "gophercolor16x16.png",
-                               File:    "gophercolor16x16.png",
-                               ModTime: time.Date(2010, 9, 5, 15, 52, 58, 0, timeZone(+10*time.Hour)),
-                               Mode:    0644,
+                               Name:     "gophercolor16x16.png",
+                               File:     "gophercolor16x16.png",
+                               Modified: time.Date(2010, 9, 5, 15, 52, 58, 0, timeZone(+10*time.Hour)),
+                               Mode:     0644,
                        },
                },
        },
@@ -90,10 +91,10 @@ var tests = []ZipTest{
                Source: returnRecursiveZip,
                File: []ZipTestFile{
                        {
-                               Name:    "r/r.zip",
-                               Content: rZipBytes(),
-                               ModTime: time.Date(2010, 3, 4, 0, 24, 16, 0, time.UTC),
-                               Mode:    0666,
+                               Name:     "r/r.zip",
+                               Content:  rZipBytes(),
+                               Modified: time.Date(2010, 3, 4, 0, 24, 16, 0, time.UTC),
+                               Mode:     0666,
                        },
                },
        },
@@ -101,10 +102,10 @@ var tests = []ZipTest{
                Name: "symlink.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "symlink",
-                               Content: []byte("../target"),
-                               ModTime: time.Date(2012, 2, 3, 19, 56, 48, 0, timeZone(-2*time.Hour)),
-                               Mode:    0777 | os.ModeSymlink,
+                               Name:     "symlink",
+                               Content:  []byte("../target"),
+                               Modified: time.Date(2012, 2, 3, 19, 56, 48, 0, timeZone(-2*time.Hour)),
+                               Mode:     0777 | os.ModeSymlink,
                        },
                },
        },
@@ -119,10 +120,10 @@ var tests = []ZipTest{
                Name: "dd.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "filename",
-                               Content: []byte("This is a test textfile.\n"),
-                               ModTime: time.Date(2011, 2, 2, 13, 6, 20, 0, time.UTC),
-                               Mode:    0666,
+                               Name:     "filename",
+                               Content:  []byte("This is a test textfile.\n"),
+                               Modified: time.Date(2011, 2, 2, 13, 6, 20, 0, time.UTC),
+                               Mode:     0666,
                        },
                },
        },
@@ -131,28 +132,28 @@ var tests = []ZipTest{
                Name: "winxp.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "hello",
-                               Content: []byte("world \r\n"),
-                               ModTime: time.Date(2011, 12, 8, 10, 4, 24, 0, time.UTC),
-                               Mode:    0666,
+                               Name:     "hello",
+                               Content:  []byte("world \r\n"),
+                               Modified: time.Date(2011, 12, 8, 10, 4, 24, 0, time.UTC),
+                               Mode:     0666,
                        },
                        {
-                               Name:    "dir/bar",
-                               Content: []byte("foo \r\n"),
-                               ModTime: time.Date(2011, 12, 8, 10, 4, 50, 0, time.UTC),
-                               Mode:    0666,
+                               Name:     "dir/bar",
+                               Content:  []byte("foo \r\n"),
+                               Modified: time.Date(2011, 12, 8, 10, 4, 50, 0, time.UTC),
+                               Mode:     0666,
                        },
                        {
-                               Name:    "dir/empty/",
-                               Content: []byte{},
-                               ModTime: time.Date(2011, 12, 8, 10, 8, 6, 0, time.UTC),
-                               Mode:    os.ModeDir | 0777,
+                               Name:     "dir/empty/",
+                               Content:  []byte{},
+                               Modified: time.Date(2011, 12, 8, 10, 8, 6, 0, time.UTC),
+                               Mode:     os.ModeDir | 0777,
                        },
                        {
-                               Name:    "readonly",
-                               Content: []byte("important \r\n"),
-                               ModTime: time.Date(2011, 12, 8, 10, 6, 8, 0, time.UTC),
-                               Mode:    0444,
+                               Name:     "readonly",
+                               Content:  []byte("important \r\n"),
+                               Modified: time.Date(2011, 12, 8, 10, 6, 8, 0, time.UTC),
+                               Mode:     0444,
                        },
                },
        },
@@ -161,28 +162,28 @@ var tests = []ZipTest{
                Name: "unix.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "hello",
-                               Content: []byte("world \r\n"),
-                               ModTime: time.Date(2011, 12, 8, 10, 4, 24, 0, timeZone(0)),
-                               Mode:    0666,
+                               Name:     "hello",
+                               Content:  []byte("world \r\n"),
+                               Modified: time.Date(2011, 12, 8, 10, 4, 24, 0, timeZone(0)),
+                               Mode:     0666,
                        },
                        {
-                               Name:    "dir/bar",
-                               Content: []byte("foo \r\n"),
-                               ModTime: time.Date(2011, 12, 8, 10, 4, 50, 0, timeZone(0)),
-                               Mode:    0666,
+                               Name:     "dir/bar",
+                               Content:  []byte("foo \r\n"),
+                               Modified: time.Date(2011, 12, 8, 10, 4, 50, 0, timeZone(0)),
+                               Mode:     0666,
                        },
                        {
-                               Name:    "dir/empty/",
-                               Content: []byte{},
-                               ModTime: time.Date(2011, 12, 8, 10, 8, 6, 0, timeZone(0)),
-                               Mode:    os.ModeDir | 0777,
+                               Name:     "dir/empty/",
+                               Content:  []byte{},
+                               Modified: time.Date(2011, 12, 8, 10, 8, 6, 0, timeZone(0)),
+                               Mode:     os.ModeDir | 0777,
                        },
                        {
-                               Name:    "readonly",
-                               Content: []byte("important \r\n"),
-                               ModTime: time.Date(2011, 12, 8, 10, 6, 8, 0, timeZone(0)),
-                               Mode:    0444,
+                               Name:     "readonly",
+                               Content:  []byte("important \r\n"),
+                               Modified: time.Date(2011, 12, 8, 10, 6, 8, 0, timeZone(0)),
+                               Mode:     0444,
                        },
                },
        },
@@ -192,16 +193,16 @@ var tests = []ZipTest{
                Name: "go-no-datadesc-sig.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "foo.txt",
-                               Content: []byte("foo\n"),
-                               ModTime: time.Date(2012, 3, 8, 16, 59, 10, 0, timeZone(-8*time.Hour)),
-                               Mode:    0644,
+                               Name:     "foo.txt",
+                               Content:  []byte("foo\n"),
+                               Modified: time.Date(2012, 3, 8, 16, 59, 10, 0, timeZone(-8*time.Hour)),
+                               Mode:     0644,
                        },
                        {
-                               Name:    "bar.txt",
-                               Content: []byte("bar\n"),
-                               ModTime: time.Date(2012, 3, 8, 16, 59, 12, 0, timeZone(-8*time.Hour)),
-                               Mode:    0644,
+                               Name:     "bar.txt",
+                               Content:  []byte("bar\n"),
+                               Modified: time.Date(2012, 3, 8, 16, 59, 12, 0, timeZone(-8*time.Hour)),
+                               Mode:     0644,
                        },
                },
        },
@@ -211,16 +212,16 @@ var tests = []ZipTest{
                Name: "go-with-datadesc-sig.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "foo.txt",
-                               Content: []byte("foo\n"),
-                               ModTime: time.Date(1979, 11, 30, 0, 0, 0, 0, time.UTC),
-                               Mode:    0666,
+                               Name:     "foo.txt",
+                               Content:  []byte("foo\n"),
+                               Modified: time.Date(1979, 11, 30, 0, 0, 0, 0, time.UTC),
+                               Mode:     0666,
                        },
                        {
-                               Name:    "bar.txt",
-                               Content: []byte("bar\n"),
-                               ModTime: time.Date(1979, 11, 30, 0, 0, 0, 0, time.UTC),
-                               Mode:    0666,
+                               Name:     "bar.txt",
+                               Content:  []byte("bar\n"),
+                               Modified: time.Date(1979, 11, 30, 0, 0, 0, 0, time.UTC),
+                               Mode:     0666,
                        },
                },
        },
@@ -231,15 +232,15 @@ var tests = []ZipTest{
                        {
                                Name:       "foo.txt",
                                Content:    []byte("foo\n"),
-                               ModTime:    time.Date(1979, 11, 30, 0, 0, 0, 0, time.UTC),
+                               Modified:   time.Date(1979, 11, 30, 0, 0, 0, 0, time.UTC),
                                Mode:       0666,
                                ContentErr: ErrChecksum,
                        },
                        {
-                               Name:    "bar.txt",
-                               Content: []byte("bar\n"),
-                               ModTime: time.Date(1979, 11, 30, 0, 0, 0, 0, time.UTC),
-                               Mode:    0666,
+                               Name:     "bar.txt",
+                               Content:  []byte("bar\n"),
+                               Modified: time.Date(1979, 11, 30, 0, 0, 0, 0, time.UTC),
+                               Mode:     0666,
                        },
                },
        },
@@ -249,16 +250,16 @@ var tests = []ZipTest{
                Name: "crc32-not-streamed.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "foo.txt",
-                               Content: []byte("foo\n"),
-                               ModTime: time.Date(2012, 3, 8, 16, 59, 10, 0, timeZone(-8*time.Hour)),
-                               Mode:    0644,
+                               Name:     "foo.txt",
+                               Content:  []byte("foo\n"),
+                               Modified: time.Date(2012, 3, 8, 16, 59, 10, 0, timeZone(-8*time.Hour)),
+                               Mode:     0644,
                        },
                        {
-                               Name:    "bar.txt",
-                               Content: []byte("bar\n"),
-                               ModTime: time.Date(2012, 3, 8, 16, 59, 12, 0, timeZone(-8*time.Hour)),
-                               Mode:    0644,
+                               Name:     "bar.txt",
+                               Content:  []byte("bar\n"),
+                               Modified: time.Date(2012, 3, 8, 16, 59, 12, 0, timeZone(-8*time.Hour)),
+                               Mode:     0644,
                        },
                },
        },
@@ -271,15 +272,15 @@ var tests = []ZipTest{
                        {
                                Name:       "foo.txt",
                                Content:    []byte("foo\n"),
-                               ModTime:    time.Date(2012, 3, 8, 16, 59, 10, 0, timeZone(-8*time.Hour)),
+                               Modified:   time.Date(2012, 3, 8, 16, 59, 10, 0, timeZone(-8*time.Hour)),
                                Mode:       0644,
                                ContentErr: ErrChecksum,
                        },
                        {
-                               Name:    "bar.txt",
-                               Content: []byte("bar\n"),
-                               ModTime: time.Date(2012, 3, 8, 16, 59, 12, 0, timeZone(-8*time.Hour)),
-                               Mode:    0644,
+                               Name:     "bar.txt",
+                               Content:  []byte("bar\n"),
+                               Modified: time.Date(2012, 3, 8, 16, 59, 12, 0, timeZone(-8*time.Hour)),
+                               Mode:     0644,
                        },
                },
        },
@@ -287,10 +288,10 @@ var tests = []ZipTest{
                Name: "zip64.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "README",
-                               Content: []byte("This small file is in ZIP64 format.\n"),
-                               ModTime: time.Date(2012, 8, 10, 14, 33, 32, 0, time.UTC),
-                               Mode:    0644,
+                               Name:     "README",
+                               Content:  []byte("This small file is in ZIP64 format.\n"),
+                               Modified: time.Date(2012, 8, 10, 14, 33, 32, 0, time.UTC),
+                               Mode:     0644,
                        },
                },
        },
@@ -299,10 +300,10 @@ var tests = []ZipTest{
                Name: "zip64-2.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "README",
-                               Content: []byte("This small file is in ZIP64 format.\n"),
-                               ModTime: time.Date(2012, 8, 10, 14, 33, 32, 0, timeZone(-4*time.Hour)),
-                               Mode:    0644,
+                               Name:     "README",
+                               Content:  []byte("This small file is in ZIP64 format.\n"),
+                               Modified: time.Date(2012, 8, 10, 14, 33, 32, 0, timeZone(-4*time.Hour)),
+                               Mode:     0644,
                        },
                },
        },
@@ -312,11 +313,11 @@ var tests = []ZipTest{
                Source: returnBigZipBytes,
                File: []ZipTestFile{
                        {
-                               Name:    "big.file",
-                               Content: nil,
-                               Size:    1<<32 - 1,
-                               ModTime: time.Date(1979, 11, 30, 0, 0, 0, 0, time.UTC),
-                               Mode:    0666,
+                               Name:     "big.file",
+                               Content:  nil,
+                               Size:     1<<32 - 1,
+                               Modified: time.Date(1979, 11, 30, 0, 0, 0, 0, time.UTC),
+                               Mode:     0666,
                        },
                },
        },
@@ -324,10 +325,10 @@ var tests = []ZipTest{
                Name: "utf8-7zip.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "世界",
-                               Content: []byte{},
-                               Mode:    0666,
-                               ModTime: time.Date(2017, 11, 6, 13, 9, 27, 867862500, timeZone(-8*time.Hour)),
+                               Name:     "世界",
+                               Content:  []byte{},
+                               Mode:     0666,
+                               Modified: time.Date(2017, 11, 6, 13, 9, 27, 867862500, timeZone(-8*time.Hour)),
                        },
                },
        },
@@ -342,8 +343,8 @@ var tests = []ZipTest{
                                // We don't do UTF-8 detection for multi-byte runes due to
                                // false-positives with other encodings (e.g., Shift-JIS).
                                // Format says encoding is not UTF-8, so we trust it.
-                               NonUTF8: true,
-                               ModTime: time.Date(2017, 11, 6, 13, 9, 27, 0, timeZone(-8*time.Hour)),
+                               NonUTF8:  true,
+                               Modified: time.Date(2017, 11, 6, 13, 9, 27, 0, timeZone(-8*time.Hour)),
                        },
                },
        },
@@ -355,8 +356,8 @@ var tests = []ZipTest{
                                Content: []byte{},
                                Mode:    0644,
                                // Name is valid UTF-8, but format does not have UTF-8 set.
-                               NonUTF8: true,
-                               ModTime: time.Date(2017, 11, 6, 13, 9, 27, 0, timeZone(-8*time.Hour)),
+                               NonUTF8:  true,
+                               Modified: time.Date(2017, 11, 6, 13, 9, 27, 0, timeZone(-8*time.Hour)),
                        },
                },
        },
@@ -364,10 +365,10 @@ var tests = []ZipTest{
                Name: "utf8-winrar.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "世界",
-                               Content: []byte{},
-                               Mode:    0666,
-                               ModTime: time.Date(2017, 11, 6, 13, 9, 27, 867862500, timeZone(-8*time.Hour)),
+                               Name:     "世界",
+                               Content:  []byte{},
+                               Mode:     0666,
+                               Modified: time.Date(2017, 11, 6, 13, 9, 27, 867862500, timeZone(-8*time.Hour)),
                        },
                },
        },
@@ -375,10 +376,10 @@ var tests = []ZipTest{
                Name: "utf8-winzip.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "世界",
-                               Content: []byte{},
-                               Mode:    0666,
-                               ModTime: time.Date(2017, 11, 6, 13, 9, 27, 867000000, timeZone(-8*time.Hour)),
+                               Name:     "世界",
+                               Content:  []byte{},
+                               Mode:     0666,
+                               Modified: time.Date(2017, 11, 6, 13, 9, 27, 867000000, timeZone(-8*time.Hour)),
                        },
                },
        },
@@ -386,11 +387,11 @@ var tests = []ZipTest{
                Name: "time-7zip.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "test.txt",
-                               Content: []byte{},
-                               Size:    1<<32 - 1,
-                               ModTime: time.Date(2017, 10, 31, 21, 11, 57, 244817900, timeZone(-7*time.Hour)),
-                               Mode:    0666,
+                               Name:     "test.txt",
+                               Content:  []byte{},
+                               Size:     1<<32 - 1,
+                               Modified: time.Date(2017, 10, 31, 21, 11, 57, 244817900, timeZone(-7*time.Hour)),
+                               Mode:     0666,
                        },
                },
        },
@@ -398,11 +399,11 @@ var tests = []ZipTest{
                Name: "time-infozip.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "test.txt",
-                               Content: []byte{},
-                               Size:    1<<32 - 1,
-                               ModTime: time.Date(2017, 10, 31, 21, 11, 57, 0, timeZone(-7*time.Hour)),
-                               Mode:    0644,
+                               Name:     "test.txt",
+                               Content:  []byte{},
+                               Size:     1<<32 - 1,
+                               Modified: time.Date(2017, 10, 31, 21, 11, 57, 0, timeZone(-7*time.Hour)),
+                               Mode:     0644,
                        },
                },
        },
@@ -410,11 +411,11 @@ var tests = []ZipTest{
                Name: "time-osx.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "test.txt",
-                               Content: []byte{},
-                               Size:    1<<32 - 1,
-                               ModTime: time.Date(2017, 10, 31, 21, 17, 27, 0, timeZone(-7*time.Hour)),
-                               Mode:    0644,
+                               Name:     "test.txt",
+                               Content:  []byte{},
+                               Size:     1<<32 - 1,
+                               Modified: time.Date(2017, 10, 31, 21, 17, 27, 0, timeZone(-7*time.Hour)),
+                               Mode:     0644,
                        },
                },
        },
@@ -422,11 +423,11 @@ var tests = []ZipTest{
                Name: "time-win7.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "test.txt",
-                               Content: []byte{},
-                               Size:    1<<32 - 1,
-                               ModTime: time.Date(2017, 10, 31, 21, 11, 58, 0, time.UTC),
-                               Mode:    0666,
+                               Name:     "test.txt",
+                               Content:  []byte{},
+                               Size:     1<<32 - 1,
+                               Modified: time.Date(2017, 10, 31, 21, 11, 58, 0, time.UTC),
+                               Mode:     0666,
                        },
                },
        },
@@ -434,11 +435,11 @@ var tests = []ZipTest{
                Name: "time-winrar.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "test.txt",
-                               Content: []byte{},
-                               Size:    1<<32 - 1,
-                               ModTime: time.Date(2017, 10, 31, 21, 11, 57, 244817900, timeZone(-7*time.Hour)),
-                               Mode:    0666,
+                               Name:     "test.txt",
+                               Content:  []byte{},
+                               Size:     1<<32 - 1,
+                               Modified: time.Date(2017, 10, 31, 21, 11, 57, 244817900, timeZone(-7*time.Hour)),
+                               Mode:     0666,
                        },
                },
        },
@@ -446,11 +447,11 @@ var tests = []ZipTest{
                Name: "time-winzip.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "test.txt",
-                               Content: []byte{},
-                               Size:    1<<32 - 1,
-                               ModTime: time.Date(2017, 10, 31, 21, 11, 57, 244000000, timeZone(-7*time.Hour)),
-                               Mode:    0666,
+                               Name:     "test.txt",
+                               Content:  []byte{},
+                               Size:     1<<32 - 1,
+                               Modified: time.Date(2017, 10, 31, 21, 11, 57, 244000000, timeZone(-7*time.Hour)),
+                               Mode:     0666,
                        },
                },
        },
@@ -458,11 +459,23 @@ var tests = []ZipTest{
                Name: "time-go.zip",
                File: []ZipTestFile{
                        {
-                               Name:    "test.txt",
-                               Content: []byte{},
-                               Size:    1<<32 - 1,
-                               ModTime: time.Date(2017, 10, 31, 21, 11, 57, 0, timeZone(-7*time.Hour)),
-                               Mode:    0666,
+                               Name:     "test.txt",
+                               Content:  []byte{},
+                               Size:     1<<32 - 1,
+                               Modified: time.Date(2017, 10, 31, 21, 11, 57, 0, timeZone(-7*time.Hour)),
+                               Mode:     0666,
+                       },
+               },
+       },
+       {
+               Name: "time-22738.zip",
+               File: []ZipTestFile{
+                       {
+                               Name:     "file",
+                               Content:  []byte{},
+                               Mode:     0666,
+                               Modified: time.Date(1999, 12, 31, 19, 0, 0, 0, timeZone(-5*time.Hour)),
+                               ModTime:  time.Date(1999, 12, 31, 19, 0, 0, 0, time.UTC),
                        },
                },
        },
@@ -470,7 +483,9 @@ var tests = []ZipTest{
 
 func TestReader(t *testing.T) {
        for _, zt := range tests {
-               readTestZip(t, zt)
+               t.Run(zt.Name, func(t *testing.T) {
+                       readTestZip(t, zt)
+               })
        }
 }
 
@@ -489,7 +504,7 @@ func readTestZip(t *testing.T, zt ZipTest) {
                }
        }
        if err != zt.Error {
-               t.Errorf("%s: error=%v, want %v", zt.Name, err, zt.Error)
+               t.Errorf("error=%v, want %v", err, zt.Error)
                return
        }
 
@@ -505,16 +520,19 @@ func readTestZip(t *testing.T, zt ZipTest) {
        }
 
        if z.Comment != zt.Comment {
-               t.Errorf("%s: comment=%q, want %q", zt.Name, z.Comment, zt.Comment)
+               t.Errorf("comment=%q, want %q", z.Comment, zt.Comment)
        }
        if len(z.File) != len(zt.File) {
-               t.Fatalf("%s: file count=%d, want %d", zt.Name, len(z.File), len(zt.File))
+               t.Fatalf("file count=%d, want %d", len(z.File), len(zt.File))
        }
 
        // test read of each file
        for i, ft := range zt.File {
                readTestFile(t, zt, ft, z.File[i])
        }
+       if t.Failed() {
+               return
+       }
 
        // test simultaneous reads
        n := 0
@@ -541,13 +559,16 @@ func equalTimeAndZone(t1, t2 time.Time) bool {
 
 func readTestFile(t *testing.T, zt ZipTest, ft ZipTestFile, f *File) {
        if f.Name != ft.Name {
-               t.Errorf("%s: name=%q, want %q", zt.Name, f.Name, ft.Name)
+               t.Errorf("name=%q, want %q", f.Name, ft.Name)
+       }
+       if !ft.Modified.IsZero() && !equalTimeAndZone(f.Modified, ft.Modified) {
+               t.Errorf("%s: Modified=%s, want %s", f.Name, f.Modified, ft.Modified)
        }
-       if !equalTimeAndZone(f.Modified, ft.ModTime) {
-               t.Errorf("%s: %s: mtime=%s, want %s", zt.Name, f.Name, f.Modified, ft.ModTime)
+       if !ft.ModTime.IsZero() && !equalTimeAndZone(f.ModTime(), ft.ModTime) {
+               t.Errorf("%s: ModTime=%s, want %s", f.Name, f.ModTime(), ft.ModTime)
        }
 
-       testFileMode(t, zt.Name, f, ft.Mode)
+       testFileMode(t, f, ft.Mode)
 
        size := uint64(f.UncompressedSize)
        if size == uint32max {
@@ -558,7 +579,7 @@ func readTestFile(t *testing.T, zt ZipTest, ft ZipTestFile, f *File) {
 
        r, err := f.Open()
        if err != nil {
-               t.Errorf("%s: %v", zt.Name, err)
+               t.Errorf("%v", err)
                return
        }
 
@@ -576,7 +597,7 @@ func readTestFile(t *testing.T, zt ZipTest, ft ZipTestFile, f *File) {
        var b bytes.Buffer
        _, err = io.Copy(&b, r)
        if err != ft.ContentErr {
-               t.Errorf("%s: copying contents: %v (want %v)", zt.Name, err, ft.ContentErr)
+               t.Errorf("copying contents: %v (want %v)", err, ft.ContentErr)
        }
        if err != nil {
                return
@@ -608,12 +629,12 @@ func readTestFile(t *testing.T, zt ZipTest, ft ZipTestFile, f *File) {
        }
 }
 
-func testFileMode(t *testing.T, zipName string, f *File, want os.FileMode) {
+func testFileMode(t *testing.T, f *File, want os.FileMode) {
        mode := f.Mode()
        if want == 0 {
-               t.Errorf("%s: %s mode: got %v, want none", zipName, f.Name, mode)
+               t.Errorf("%s mode: got %v, want none", f.Name, mode)
        } else if mode != want {
-               t.Errorf("%s: %s mode: want %v, got %v", zipName, f.Name, want, mode)
+               t.Errorf("%s mode: want %v, got %v", f.Name, want, mode)
        }
 }
 
diff --git a/src/archive/zip/testdata/time-22738.zip b/src/archive/zip/testdata/time-22738.zip
new file mode 100644 (file)
index 0000000..eb85b57
Binary files /dev/null and b/src/archive/zip/testdata/time-22738.zip differ
index 28824d88eeb0bfa19394ef2f624c061909e7f2da..38f32296fa87d263cedfde48c1476e71e81c4bb4 100644 (file)
@@ -321,7 +321,7 @@ func testReadFile(t *testing.T, f *File, wt *WriteTest) {
        if f.Name != wt.Name {
                t.Fatalf("File name: got %q, want %q", f.Name, wt.Name)
        }
-       testFileMode(t, wt.Name, f, wt.Mode)
+       testFileMode(t, f, wt.Mode)
        rc, err := f.Open()
        if err != nil {
                t.Fatal("opening:", err)