diff options
Diffstat (limited to 'src/pkg/archive/zip/reader_test.go')
-rw-r--r-- | src/pkg/archive/zip/reader_test.go | 97 |
1 files changed, 76 insertions, 21 deletions
diff --git a/src/pkg/archive/zip/reader_test.go b/src/pkg/archive/zip/reader_test.go index fd5fed2af..9407e35d5 100644 --- a/src/pkg/archive/zip/reader_test.go +++ b/src/pkg/archive/zip/reader_test.go @@ -18,7 +18,7 @@ type ZipTest struct { Name string Comment string File []ZipTestFile - Error os.Error // the error that Opening this file should return + Error error // the error that Opening this file should return } type ZipTestFile struct { @@ -26,6 +26,7 @@ type ZipTestFile struct { Content []byte // if blank, will attempt to compare against File File string // name of file to compare to (relative to testdata/) Mtime string // modified time in format "mm-dd-yy hh:mm:ss" + Mode os.FileMode } // Caution: The Mtime values found for the test files should correspond to @@ -47,11 +48,13 @@ var tests = []ZipTest{ Name: "test.txt", Content: []byte("This is a test text file.\n"), Mtime: "09-05-10 12:12:02", + Mode: 0644, }, { Name: "gophercolor16x16.png", File: "gophercolor16x16.png", Mtime: "09-05-10 15:52:58", + Mode: 0644, }, }, }, @@ -62,11 +65,12 @@ var tests = []ZipTest{ Name: "r/r.zip", File: "r.zip", Mtime: "03-04-10 00:24:16", + Mode: 0666, }, }, }, {Name: "readme.zip"}, - {Name: "readme.notzip", Error: FormatError}, + {Name: "readme.notzip", Error: ErrFormat}, { Name: "dd.zip", File: []ZipTestFile{ @@ -74,9 +78,43 @@ var tests = []ZipTest{ Name: "filename", Content: []byte("This is a test textfile.\n"), Mtime: "02-02-11 13:06:20", + Mode: 0666, }, }, }, + { + // created in windows XP file manager. + Name: "winxp.zip", + File: crossPlatform, + }, + { + // created by Zip 3.0 under Linux + Name: "unix.zip", + File: crossPlatform, + }, +} + +var crossPlatform = []ZipTestFile{ + { + Name: "hello", + Content: []byte("world \r\n"), + Mode: 0666, + }, + { + Name: "dir/bar", + Content: []byte("foo \r\n"), + Mode: 0666, + }, + { + Name: "dir/empty/", + Content: []byte{}, + Mode: os.ModeDir | 0777, + }, + { + Name: "readonly", + Content: []byte("important \r\n"), + Mode: 0444, + }, } func TestReader(t *testing.T) { @@ -93,10 +131,14 @@ func readTestZip(t *testing.T, zt ZipTest) { } // bail if file is not zip - if err == FormatError { + if err == ErrFormat { return } - defer z.Close() + defer func() { + if err := z.Close(); err != nil { + t.Errorf("error %q when closing zip file", err) + } + }() // bail here if no Files expected to be tested // (there may actually be files in the zip, but we don't care) @@ -121,10 +163,10 @@ func readTestZip(t *testing.T, zt ZipTest) { done := make(chan bool) for i := 0; i < 5; i++ { for j, ft := range zt.File { - go func() { + go func(j int, ft ZipTestFile) { readTestFile(t, ft, z.File[j]) done <- true - }() + }(j, ft) n++ } } @@ -142,8 +184,8 @@ func readTestZip(t *testing.T, zt ZipTest) { } var b bytes.Buffer _, err = io.Copy(&b, r) - if err != ChecksumError { - t.Errorf("%s: copy error=%v, want %v", z.File[0].Name, err, ChecksumError) + if err != ErrChecksum { + t.Errorf("%s: copy error=%v, want %v", z.File[0].Name, err, ErrChecksum) } } } @@ -153,15 +195,19 @@ func readTestFile(t *testing.T, ft ZipTestFile, f *File) { t.Errorf("name=%q, want %q", f.Name, ft.Name) } - mtime, err := time.Parse("01-02-06 15:04:05", ft.Mtime) - if err != nil { - t.Error(err) - return - } - if got, want := f.Mtime_ns()/1e9, mtime.Seconds(); got != want { - t.Errorf("%s: mtime=%s (%d); want %s (%d)", f.Name, time.SecondsToUTC(got), got, mtime, want) + if ft.Mtime != "" { + mtime, err := time.Parse("01-02-06 15:04:05", ft.Mtime) + if err != nil { + t.Error(err) + return + } + if ft := f.ModTime(); !ft.Equal(mtime) { + t.Errorf("%s: mtime=%s, want %s", f.Name, ft, mtime) + } } + testFileMode(t, f, ft.Mode) + size0 := f.UncompressedSize var b bytes.Buffer @@ -183,7 +229,7 @@ func readTestFile(t *testing.T, ft ZipTestFile, f *File) { r.Close() var c []byte - if len(ft.Content) != 0 { + if ft.Content != nil { c = ft.Content } else if c, err = ioutil.ReadFile("testdata/" + ft.File); err != nil { t.Error(err) @@ -203,14 +249,23 @@ func readTestFile(t *testing.T, ft ZipTestFile, f *File) { } } +func testFileMode(t *testing.T, f *File, want os.FileMode) { + mode := f.Mode() + if want == 0 { + t.Errorf("%s mode: got %v, want none", f.Name, mode) + } else if mode != want { + t.Errorf("%s mode: want %v, got %v", f.Name, want, mode) + } +} + func TestInvalidFiles(t *testing.T) { const size = 1024 * 70 // 70kb b := make([]byte, size) // zeroes _, err := NewReader(sliceReaderAt(b), size) - if err != FormatError { - t.Errorf("zeroes: error=%v, want %v", err, FormatError) + if err != ErrFormat { + t.Errorf("zeroes: error=%v, want %v", err, ErrFormat) } // repeated directoryEndSignatures @@ -220,14 +275,14 @@ func TestInvalidFiles(t *testing.T) { copy(b[i:i+4], sig) } _, err = NewReader(sliceReaderAt(b), size) - if err != FormatError { - t.Errorf("sigs: error=%v, want %v", err, FormatError) + if err != ErrFormat { + t.Errorf("sigs: error=%v, want %v", err, ErrFormat) } } type sliceReaderAt []byte -func (r sliceReaderAt) ReadAt(b []byte, off int64) (int, os.Error) { +func (r sliceReaderAt) ReadAt(b []byte, off int64) (int, error) { copy(b, r[int(off):int(off)+len(b)]) return len(b), nil } |