]> Cypherpunks repositories - gostls13.git/commitdiff
archive/tar: compact slices in tests
authorJoe Tsai <joetsai@digital-static.net>
Fri, 14 Oct 2016 00:14:24 +0000 (17:14 -0700)
committerJoe Tsai <thebrokentoaster@gmail.com>
Wed, 19 Oct 2016 18:38:34 +0000 (18:38 +0000)
Took this opportunity to also embed tables in the functions
that they are actually used in and other stylistic cleanups.

There was no logical changes to the tests.

Change-Id: Ifa724060532175f6f4407d6cedc841891efd8f7b
Reviewed-on: https://go-review.googlesource.com/31436
Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/archive/tar/reader_test.go
src/archive/tar/tar_test.go
src/archive/tar/writer_test.go

index 18232d72701e203ae03512ac7fb27c3687961375..7d73be22322b797f2f37650d65b5e8d12fca3f2e 100644 (file)
@@ -18,17 +18,15 @@ import (
        "time"
 )
 
-type untarTest struct {
-       file    string    // Test input file
-       headers []*Header // Expected output headers
-       chksums []string  // MD5 checksum of files, leave as nil if not checked
-       err     error     // Expected error to occur
-}
-
-var gnuTarTest = &untarTest{
-       file: "testdata/gnu.tar",
-       headers: []*Header{
-               {
+func TestReader(t *testing.T) {
+       vectors := []struct {
+               file    string    // Test input file
+               headers []*Header // Expected output headers
+               chksums []string  // MD5 checksum of files, leave as nil if not checked
+               err     error     // Expected error to occur
+       }{{
+               file: "testdata/gnu.tar",
+               headers: []*Header{{
                        Name:     "small.txt",
                        Mode:     0640,
                        Uid:      73025,
@@ -38,8 +36,7 @@ var gnuTarTest = &untarTest{
                        Typeflag: '0',
                        Uname:    "dsymonds",
                        Gname:    "eng",
-               },
-               {
+               }, {
                        Name:     "small2.txt",
                        Mode:     0640,
                        Uid:      73025,
@@ -49,18 +46,14 @@ var gnuTarTest = &untarTest{
                        Typeflag: '0',
                        Uname:    "dsymonds",
                        Gname:    "eng",
+               }},
+               chksums: []string{
+                       "e38b27eaccb4391bdec553a7f3ae6b2f",
+                       "c65bd2e50a56a2138bf1716f2fd56fe9",
                },
-       },
-       chksums: []string{
-               "e38b27eaccb4391bdec553a7f3ae6b2f",
-               "c65bd2e50a56a2138bf1716f2fd56fe9",
-       },
-}
-
-var sparseTarTest = &untarTest{
-       file: "testdata/sparse-formats.tar",
-       headers: []*Header{
-               {
+       }, {
+               file: "testdata/sparse-formats.tar",
+               headers: []*Header{{
                        Name:     "sparse-gnu",
                        Mode:     420,
                        Uid:      1000,
@@ -73,8 +66,7 @@ var sparseTarTest = &untarTest{
                        Gname:    "david",
                        Devmajor: 0,
                        Devminor: 0,
-               },
-               {
+               }, {
                        Name:     "sparse-posix-0.0",
                        Mode:     420,
                        Uid:      1000,
@@ -87,8 +79,7 @@ var sparseTarTest = &untarTest{
                        Gname:    "david",
                        Devmajor: 0,
                        Devminor: 0,
-               },
-               {
+               }, {
                        Name:     "sparse-posix-0.1",
                        Mode:     420,
                        Uid:      1000,
@@ -101,8 +92,7 @@ var sparseTarTest = &untarTest{
                        Gname:    "david",
                        Devmajor: 0,
                        Devminor: 0,
-               },
-               {
+               }, {
                        Name:     "sparse-posix-1.0",
                        Mode:     420,
                        Uid:      1000,
@@ -115,8 +105,7 @@ var sparseTarTest = &untarTest{
                        Gname:    "david",
                        Devmajor: 0,
                        Devminor: 0,
-               },
-               {
+               }, {
                        Name:     "end",
                        Mode:     420,
                        Uid:      1000,
@@ -129,115 +118,95 @@ var sparseTarTest = &untarTest{
                        Gname:    "david",
                        Devmajor: 0,
                        Devminor: 0,
+               }},
+               chksums: []string{
+                       "6f53234398c2449fe67c1812d993012f",
+                       "6f53234398c2449fe67c1812d993012f",
+                       "6f53234398c2449fe67c1812d993012f",
+                       "6f53234398c2449fe67c1812d993012f",
+                       "b0061974914468de549a2af8ced10316",
                },
-       },
-       chksums: []string{
-               "6f53234398c2449fe67c1812d993012f",
-               "6f53234398c2449fe67c1812d993012f",
-               "6f53234398c2449fe67c1812d993012f",
-               "6f53234398c2449fe67c1812d993012f",
-               "b0061974914468de549a2af8ced10316",
-       },
-}
-
-var untarTests = []*untarTest{
-       gnuTarTest,
-       sparseTarTest,
-       {
+       }, {
                file: "testdata/star.tar",
-               headers: []*Header{
-                       {
-                               Name:       "small.txt",
-                               Mode:       0640,
-                               Uid:        73025,
-                               Gid:        5000,
-                               Size:       5,
-                               ModTime:    time.Unix(1244592783, 0),
-                               Typeflag:   '0',
-                               Uname:      "dsymonds",
-                               Gname:      "eng",
-                               AccessTime: time.Unix(1244592783, 0),
-                               ChangeTime: time.Unix(1244592783, 0),
-                       },
-                       {
-                               Name:       "small2.txt",
-                               Mode:       0640,
-                               Uid:        73025,
-                               Gid:        5000,
-                               Size:       11,
-                               ModTime:    time.Unix(1244592783, 0),
-                               Typeflag:   '0',
-                               Uname:      "dsymonds",
-                               Gname:      "eng",
-                               AccessTime: time.Unix(1244592783, 0),
-                               ChangeTime: time.Unix(1244592783, 0),
-                       },
-               },
-       },
-       {
+               headers: []*Header{{
+                       Name:       "small.txt",
+                       Mode:       0640,
+                       Uid:        73025,
+                       Gid:        5000,
+                       Size:       5,
+                       ModTime:    time.Unix(1244592783, 0),
+                       Typeflag:   '0',
+                       Uname:      "dsymonds",
+                       Gname:      "eng",
+                       AccessTime: time.Unix(1244592783, 0),
+                       ChangeTime: time.Unix(1244592783, 0),
+               }, {
+                       Name:       "small2.txt",
+                       Mode:       0640,
+                       Uid:        73025,
+                       Gid:        5000,
+                       Size:       11,
+                       ModTime:    time.Unix(1244592783, 0),
+                       Typeflag:   '0',
+                       Uname:      "dsymonds",
+                       Gname:      "eng",
+                       AccessTime: time.Unix(1244592783, 0),
+                       ChangeTime: time.Unix(1244592783, 0),
+               }},
+       }, {
                file: "testdata/v7.tar",
-               headers: []*Header{
-                       {
-                               Name:     "small.txt",
-                               Mode:     0444,
-                               Uid:      73025,
-                               Gid:      5000,
-                               Size:     5,
-                               ModTime:  time.Unix(1244593104, 0),
-                               Typeflag: '\x00',
-                       },
-                       {
-                               Name:     "small2.txt",
-                               Mode:     0444,
-                               Uid:      73025,
-                               Gid:      5000,
-                               Size:     11,
-                               ModTime:  time.Unix(1244593104, 0),
-                               Typeflag: '\x00',
-                       },
-               },
-       },
-       {
+               headers: []*Header{{
+                       Name:     "small.txt",
+                       Mode:     0444,
+                       Uid:      73025,
+                       Gid:      5000,
+                       Size:     5,
+                       ModTime:  time.Unix(1244593104, 0),
+                       Typeflag: '\x00',
+               }, {
+                       Name:     "small2.txt",
+                       Mode:     0444,
+                       Uid:      73025,
+                       Gid:      5000,
+                       Size:     11,
+                       ModTime:  time.Unix(1244593104, 0),
+                       Typeflag: '\x00',
+               }},
+       }, {
                file: "testdata/pax.tar",
-               headers: []*Header{
-                       {
-                               Name:       "a/123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
-                               Mode:       0664,
-                               Uid:        1000,
-                               Gid:        1000,
-                               Uname:      "shane",
-                               Gname:      "shane",
-                               Size:       7,
-                               ModTime:    time.Unix(1350244992, 23960108),
-                               ChangeTime: time.Unix(1350244992, 23960108),
-                               AccessTime: time.Unix(1350244992, 23960108),
-                               Typeflag:   TypeReg,
-                       },
-                       {
-                               Name:       "a/b",
-                               Mode:       0777,
-                               Uid:        1000,
-                               Gid:        1000,
-                               Uname:      "shane",
-                               Gname:      "shane",
-                               Size:       0,
-                               ModTime:    time.Unix(1350266320, 910238425),
-                               ChangeTime: time.Unix(1350266320, 910238425),
-                               AccessTime: time.Unix(1350266320, 910238425),
-                               Typeflag:   TypeSymlink,
-                               Linkname:   "123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
-                       },
-               },
-       },
-       {
+               headers: []*Header{{
+                       Name:       "a/123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
+                       Mode:       0664,
+                       Uid:        1000,
+                       Gid:        1000,
+                       Uname:      "shane",
+                       Gname:      "shane",
+                       Size:       7,
+                       ModTime:    time.Unix(1350244992, 23960108),
+                       ChangeTime: time.Unix(1350244992, 23960108),
+                       AccessTime: time.Unix(1350244992, 23960108),
+                       Typeflag:   TypeReg,
+               }, {
+                       Name:       "a/b",
+                       Mode:       0777,
+                       Uid:        1000,
+                       Gid:        1000,
+                       Uname:      "shane",
+                       Gname:      "shane",
+                       Size:       0,
+                       ModTime:    time.Unix(1350266320, 910238425),
+                       ChangeTime: time.Unix(1350266320, 910238425),
+                       AccessTime: time.Unix(1350266320, 910238425),
+                       Typeflag:   TypeSymlink,
+                       Linkname:   "123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
+               }},
+       }, {
                file: "testdata/pax-bad-hdr-file.tar",
                err:  ErrHeader,
-       },
-       {
+       }, {
                file: "testdata/pax-bad-mtime-file.tar",
                err:  ErrHeader,
-       },
-       {
+       }, {
                file: "testdata/pax-pos-size-file.tar",
                headers: []*Header{{
                        Name:     "foo",
@@ -253,157 +222,133 @@ var untarTests = []*untarTest{
                chksums: []string{
                        "0afb597b283fe61b5d4879669a350556",
                },
-       },
-       {
+       }, {
                file: "testdata/nil-uid.tar", // golang.org/issue/5290
-               headers: []*Header{
-                       {
-                               Name:     "P1050238.JPG.log",
-                               Mode:     0664,
-                               Uid:      0,
-                               Gid:      0,
-                               Size:     14,
-                               ModTime:  time.Unix(1365454838, 0),
-                               Typeflag: TypeReg,
-                               Linkname: "",
-                               Uname:    "eyefi",
-                               Gname:    "eyefi",
-                               Devmajor: 0,
-                               Devminor: 0,
-                       },
-               },
-       },
-       {
+               headers: []*Header{{
+                       Name:     "P1050238.JPG.log",
+                       Mode:     0664,
+                       Uid:      0,
+                       Gid:      0,
+                       Size:     14,
+                       ModTime:  time.Unix(1365454838, 0),
+                       Typeflag: TypeReg,
+                       Linkname: "",
+                       Uname:    "eyefi",
+                       Gname:    "eyefi",
+                       Devmajor: 0,
+                       Devminor: 0,
+               }},
+       }, {
                file: "testdata/xattrs.tar",
-               headers: []*Header{
-                       {
-                               Name:       "small.txt",
-                               Mode:       0644,
-                               Uid:        1000,
-                               Gid:        10,
-                               Size:       5,
-                               ModTime:    time.Unix(1386065770, 448252320),
-                               Typeflag:   '0',
-                               Uname:      "alex",
-                               Gname:      "wheel",
-                               AccessTime: time.Unix(1389782991, 419875220),
-                               ChangeTime: time.Unix(1389782956, 794414986),
-                               Xattrs: map[string]string{
-                                       "user.key":  "value",
-                                       "user.key2": "value2",
-                                       // Interestingly, selinux encodes the terminating null inside the xattr
-                                       "security.selinux": "unconfined_u:object_r:default_t:s0\x00",
-                               },
+               headers: []*Header{{
+                       Name:       "small.txt",
+                       Mode:       0644,
+                       Uid:        1000,
+                       Gid:        10,
+                       Size:       5,
+                       ModTime:    time.Unix(1386065770, 448252320),
+                       Typeflag:   '0',
+                       Uname:      "alex",
+                       Gname:      "wheel",
+                       AccessTime: time.Unix(1389782991, 419875220),
+                       ChangeTime: time.Unix(1389782956, 794414986),
+                       Xattrs: map[string]string{
+                               "user.key":  "value",
+                               "user.key2": "value2",
+                               // Interestingly, selinux encodes the terminating null inside the xattr
+                               "security.selinux": "unconfined_u:object_r:default_t:s0\x00",
                        },
-                       {
-                               Name:       "small2.txt",
-                               Mode:       0644,
-                               Uid:        1000,
-                               Gid:        10,
-                               Size:       11,
-                               ModTime:    time.Unix(1386065770, 449252304),
-                               Typeflag:   '0',
-                               Uname:      "alex",
-                               Gname:      "wheel",
-                               AccessTime: time.Unix(1389782991, 419875220),
-                               ChangeTime: time.Unix(1386065770, 449252304),
-                               Xattrs: map[string]string{
-                                       "security.selinux": "unconfined_u:object_r:default_t:s0\x00",
-                               },
+               }, {
+                       Name:       "small2.txt",
+                       Mode:       0644,
+                       Uid:        1000,
+                       Gid:        10,
+                       Size:       11,
+                       ModTime:    time.Unix(1386065770, 449252304),
+                       Typeflag:   '0',
+                       Uname:      "alex",
+                       Gname:      "wheel",
+                       AccessTime: time.Unix(1389782991, 419875220),
+                       ChangeTime: time.Unix(1386065770, 449252304),
+                       Xattrs: map[string]string{
+                               "security.selinux": "unconfined_u:object_r:default_t:s0\x00",
                        },
-               },
-       },
-       {
+               }},
+       }, {
                // Matches the behavior of GNU, BSD, and STAR tar utilities.
                file: "testdata/gnu-multi-hdrs.tar",
-               headers: []*Header{
-                       {
-                               Name:     "GNU2/GNU2/long-path-name",
-                               Linkname: "GNU4/GNU4/long-linkpath-name",
-                               ModTime:  time.Unix(0, 0),
-                               Typeflag: '2',
-                       },
-               },
-       },
-       {
+               headers: []*Header{{
+                       Name:     "GNU2/GNU2/long-path-name",
+                       Linkname: "GNU4/GNU4/long-linkpath-name",
+                       ModTime:  time.Unix(0, 0),
+                       Typeflag: '2',
+               }},
+       }, {
                // GNU tar file with atime and ctime fields set.
                // Created with the GNU tar v1.27.1.
                //      tar --incremental -S -cvf gnu-incremental.tar test2
                file: "testdata/gnu-incremental.tar",
-               headers: []*Header{
-                       {
-                               Name:       "test2/",
-                               Mode:       16877,
-                               Uid:        1000,
-                               Gid:        1000,
-                               Size:       14,
-                               ModTime:    time.Unix(1441973427, 0),
-                               Typeflag:   'D',
-                               Uname:      "rawr",
-                               Gname:      "dsnet",
-                               AccessTime: time.Unix(1441974501, 0),
-                               ChangeTime: time.Unix(1441973436, 0),
-                       },
-                       {
-                               Name:       "test2/foo",
-                               Mode:       33188,
-                               Uid:        1000,
-                               Gid:        1000,
-                               Size:       64,
-                               ModTime:    time.Unix(1441973363, 0),
-                               Typeflag:   '0',
-                               Uname:      "rawr",
-                               Gname:      "dsnet",
-                               AccessTime: time.Unix(1441974501, 0),
-                               ChangeTime: time.Unix(1441973436, 0),
-                       },
-                       {
-                               Name:       "test2/sparse",
-                               Mode:       33188,
-                               Uid:        1000,
-                               Gid:        1000,
-                               Size:       536870912,
-                               ModTime:    time.Unix(1441973427, 0),
-                               Typeflag:   'S',
-                               Uname:      "rawr",
-                               Gname:      "dsnet",
-                               AccessTime: time.Unix(1441991948, 0),
-                               ChangeTime: time.Unix(1441973436, 0),
-                       },
-               },
-       },
-       {
+               headers: []*Header{{
+                       Name:       "test2/",
+                       Mode:       16877,
+                       Uid:        1000,
+                       Gid:        1000,
+                       Size:       14,
+                       ModTime:    time.Unix(1441973427, 0),
+                       Typeflag:   'D',
+                       Uname:      "rawr",
+                       Gname:      "dsnet",
+                       AccessTime: time.Unix(1441974501, 0),
+                       ChangeTime: time.Unix(1441973436, 0),
+               }, {
+                       Name:       "test2/foo",
+                       Mode:       33188,
+                       Uid:        1000,
+                       Gid:        1000,
+                       Size:       64,
+                       ModTime:    time.Unix(1441973363, 0),
+                       Typeflag:   '0',
+                       Uname:      "rawr",
+                       Gname:      "dsnet",
+                       AccessTime: time.Unix(1441974501, 0),
+                       ChangeTime: time.Unix(1441973436, 0),
+               }, {
+                       Name:       "test2/sparse",
+                       Mode:       33188,
+                       Uid:        1000,
+                       Gid:        1000,
+                       Size:       536870912,
+                       ModTime:    time.Unix(1441973427, 0),
+                       Typeflag:   'S',
+                       Uname:      "rawr",
+                       Gname:      "dsnet",
+                       AccessTime: time.Unix(1441991948, 0),
+                       ChangeTime: time.Unix(1441973436, 0),
+               }},
+       }, {
                // Matches the behavior of GNU and BSD tar utilities.
                file: "testdata/pax-multi-hdrs.tar",
-               headers: []*Header{
-                       {
-                               Name:     "bar",
-                               Linkname: "PAX4/PAX4/long-linkpath-name",
-                               ModTime:  time.Unix(0, 0),
-                               Typeflag: '2',
-                       },
-               },
-       },
-       {
+               headers: []*Header{{
+                       Name:     "bar",
+                       Linkname: "PAX4/PAX4/long-linkpath-name",
+                       ModTime:  time.Unix(0, 0),
+                       Typeflag: '2',
+               }},
+       }, {
                file: "testdata/neg-size.tar",
                err:  ErrHeader,
-       },
-       {
+       }, {
                file: "testdata/issue10968.tar",
                err:  ErrHeader,
-       },
-       {
+       }, {
                file: "testdata/issue11169.tar",
                err:  ErrHeader,
-       },
-       {
+       }, {
                file: "testdata/issue12435.tar",
                err:  ErrHeader,
-       },
-}
+       }}
 
-func TestReader(t *testing.T) {
-       for i, v := range untarTests {
+       for i, v := range vectors {
                f, err := os.Open(v.file)
                if err != nil {
                        t.Errorf("file %s, test %d: unexpected error: %v", v.file, i, err)
@@ -513,7 +458,7 @@ func TestPartialRead(t *testing.T) {
 }
 
 func TestSparseFileReader(t *testing.T) {
-       var vectors = []struct {
+       vectors := []struct {
                realSize   int64         // Real size of the output file
                sparseMap  []sparseEntry // Input sparse map
                sparseData string        // Input compact data
@@ -636,9 +581,11 @@ func TestSparseFileReader(t *testing.T) {
                r := bytes.NewReader([]byte(v.sparseData))
                rfr := &regFileReader{r: r, nb: int64(len(v.sparseData))}
 
-               var sfr *sparseFileReader
-               var err error
-               var buf []byte
+               var (
+                       sfr *sparseFileReader
+                       err error
+                       buf []byte
+               )
 
                sfr, err = newSparseFileReader(rfr, v.sparseMap, v.realSize)
                if err != nil {
@@ -734,7 +681,7 @@ func TestReadGNUSparseMap0x1(t *testing.T) {
                big3 = fmt.Sprintf("%d", (int64(maxInt) / 3))
        )
 
-       var vectors = []struct {
+       vectors := []struct {
                extHdrs   map[string]string // Input data
                sparseMap []sparseEntry     // Expected sparse entries to be outputted
                err       error             // Expected errors that may be raised
@@ -800,12 +747,12 @@ func TestReadGNUSparseMap0x1(t *testing.T) {
 }
 
 func TestReadGNUSparseMap1x0(t *testing.T) {
-       var sp = []sparseEntry{{1, 2}, {3, 4}}
+       sp := []sparseEntry{{1, 2}, {3, 4}}
        for i := 0; i < 98; i++ {
                sp = append(sp, sparseEntry{54321, 12345})
        }
 
-       var vectors = []struct {
+       vectors := []struct {
                input     string        // Input data
                sparseMap []sparseEntry // Expected sparse entries to be outputted
                cnt       int           // Expected number of bytes read
@@ -880,8 +827,7 @@ func TestReadGNUSparseMap1x0(t *testing.T) {
 }
 
 func TestUninitializedRead(t *testing.T) {
-       test := gnuTarTest
-       f, err := os.Open(test.file)
+       f, err := os.Open("testdata/gnu.tar")
        if err != nil {
                t.Fatalf("Unexpected error: %v", err)
        }
@@ -923,7 +869,7 @@ func TestReadTruncation(t *testing.T) {
        data2 += strings.Repeat("\x00", 10*512)
        trash := strings.Repeat("garbage ", 64) // Exactly 512 bytes
 
-       var vectors = []struct {
+       vectors := []struct {
                input string // Input stream
                cnt   int    // Expected number of headers read
                err   error  // Expected error outcome
@@ -1056,7 +1002,7 @@ func TestReadHeaderOnly(t *testing.T) {
                t.Fatalf("len(hdrs): got %d, want %d", len(hdrs), 16)
        }
        for i := 0; i < 8; i++ {
-               var hdr1, hdr2 = hdrs[i+0], hdrs[i+8]
+               hdr1, hdr2 := hdrs[i+0], hdrs[i+8]
                hdr1.Size, hdr2.Size = 0, 0
                if !reflect.DeepEqual(*hdr1, *hdr2) {
                        t.Errorf("incorrect header:\ngot  %+v\nwant %+v", *hdr1, *hdr2)
index d63c072eb9aaa489c5ec76552db060fa50f2a3ef..cf8337c2ad94038e0f2abdf1314ea8f6f51a06a6 100644 (file)
@@ -135,190 +135,178 @@ type headerRoundTripTest struct {
 }
 
 func TestHeaderRoundTrip(t *testing.T) {
-       golden := []headerRoundTripTest{
+       vectors := []headerRoundTripTest{{
                // regular file.
-               {
-                       h: &Header{
-                               Name:     "test.txt",
-                               Mode:     0644 | c_ISREG,
-                               Size:     12,
-                               ModTime:  time.Unix(1360600916, 0),
-                               Typeflag: TypeReg,
-                       },
-                       fm: 0644,
+               h: &Header{
+                       Name:     "test.txt",
+                       Mode:     0644 | c_ISREG,
+                       Size:     12,
+                       ModTime:  time.Unix(1360600916, 0),
+                       Typeflag: TypeReg,
                },
+               fm: 0644,
+       }, {
                // symbolic link.
-               {
-                       h: &Header{
-                               Name:     "link.txt",
-                               Mode:     0777 | c_ISLNK,
-                               Size:     0,
-                               ModTime:  time.Unix(1360600852, 0),
-                               Typeflag: TypeSymlink,
-                       },
-                       fm: 0777 | os.ModeSymlink,
+               h: &Header{
+                       Name:     "link.txt",
+                       Mode:     0777 | c_ISLNK,
+                       Size:     0,
+                       ModTime:  time.Unix(1360600852, 0),
+                       Typeflag: TypeSymlink,
                },
+               fm: 0777 | os.ModeSymlink,
+       }, {
                // character device node.
-               {
-                       h: &Header{
-                               Name:     "dev/null",
-                               Mode:     0666 | c_ISCHR,
-                               Size:     0,
-                               ModTime:  time.Unix(1360578951, 0),
-                               Typeflag: TypeChar,
-                       },
-                       fm: 0666 | os.ModeDevice | os.ModeCharDevice,
+               h: &Header{
+                       Name:     "dev/null",
+                       Mode:     0666 | c_ISCHR,
+                       Size:     0,
+                       ModTime:  time.Unix(1360578951, 0),
+                       Typeflag: TypeChar,
                },
+               fm: 0666 | os.ModeDevice | os.ModeCharDevice,
+       }, {
                // block device node.
-               {
-                       h: &Header{
-                               Name:     "dev/sda",
-                               Mode:     0660 | c_ISBLK,
-                               Size:     0,
-                               ModTime:  time.Unix(1360578954, 0),
-                               Typeflag: TypeBlock,
-                       },
-                       fm: 0660 | os.ModeDevice,
+               h: &Header{
+                       Name:     "dev/sda",
+                       Mode:     0660 | c_ISBLK,
+                       Size:     0,
+                       ModTime:  time.Unix(1360578954, 0),
+                       Typeflag: TypeBlock,
                },
+               fm: 0660 | os.ModeDevice,
+       }, {
                // directory.
-               {
-                       h: &Header{
-                               Name:     "dir/",
-                               Mode:     0755 | c_ISDIR,
-                               Size:     0,
-                               ModTime:  time.Unix(1360601116, 0),
-                               Typeflag: TypeDir,
-                       },
-                       fm: 0755 | os.ModeDir,
+               h: &Header{
+                       Name:     "dir/",
+                       Mode:     0755 | c_ISDIR,
+                       Size:     0,
+                       ModTime:  time.Unix(1360601116, 0),
+                       Typeflag: TypeDir,
                },
+               fm: 0755 | os.ModeDir,
+       }, {
                // fifo node.
-               {
-                       h: &Header{
-                               Name:     "dev/initctl",
-                               Mode:     0600 | c_ISFIFO,
-                               Size:     0,
-                               ModTime:  time.Unix(1360578949, 0),
-                               Typeflag: TypeFifo,
-                       },
-                       fm: 0600 | os.ModeNamedPipe,
+               h: &Header{
+                       Name:     "dev/initctl",
+                       Mode:     0600 | c_ISFIFO,
+                       Size:     0,
+                       ModTime:  time.Unix(1360578949, 0),
+                       Typeflag: TypeFifo,
                },
+               fm: 0600 | os.ModeNamedPipe,
+       }, {
                // setuid.
-               {
-                       h: &Header{
-                               Name:     "bin/su",
-                               Mode:     0755 | c_ISREG | c_ISUID,
-                               Size:     23232,
-                               ModTime:  time.Unix(1355405093, 0),
-                               Typeflag: TypeReg,
-                       },
-                       fm: 0755 | os.ModeSetuid,
+               h: &Header{
+                       Name:     "bin/su",
+                       Mode:     0755 | c_ISREG | c_ISUID,
+                       Size:     23232,
+                       ModTime:  time.Unix(1355405093, 0),
+                       Typeflag: TypeReg,
                },
+               fm: 0755 | os.ModeSetuid,
+       }, {
                // setguid.
-               {
-                       h: &Header{
-                               Name:     "group.txt",
-                               Mode:     0750 | c_ISREG | c_ISGID,
-                               Size:     0,
-                               ModTime:  time.Unix(1360602346, 0),
-                               Typeflag: TypeReg,
-                       },
-                       fm: 0750 | os.ModeSetgid,
+               h: &Header{
+                       Name:     "group.txt",
+                       Mode:     0750 | c_ISREG | c_ISGID,
+                       Size:     0,
+                       ModTime:  time.Unix(1360602346, 0),
+                       Typeflag: TypeReg,
                },
+               fm: 0750 | os.ModeSetgid,
+       }, {
                // sticky.
-               {
-                       h: &Header{
-                               Name:     "sticky.txt",
-                               Mode:     0600 | c_ISREG | c_ISVTX,
-                               Size:     7,
-                               ModTime:  time.Unix(1360602540, 0),
-                               Typeflag: TypeReg,
-                       },
-                       fm: 0600 | os.ModeSticky,
+               h: &Header{
+                       Name:     "sticky.txt",
+                       Mode:     0600 | c_ISREG | c_ISVTX,
+                       Size:     7,
+                       ModTime:  time.Unix(1360602540, 0),
+                       Typeflag: TypeReg,
                },
+               fm: 0600 | os.ModeSticky,
+       }, {
                // hard link.
-               {
-                       h: &Header{
-                               Name:     "hard.txt",
-                               Mode:     0644 | c_ISREG,
-                               Size:     0,
-                               Linkname: "file.txt",
-                               ModTime:  time.Unix(1360600916, 0),
-                               Typeflag: TypeLink,
-                       },
-                       fm: 0644,
+               h: &Header{
+                       Name:     "hard.txt",
+                       Mode:     0644 | c_ISREG,
+                       Size:     0,
+                       Linkname: "file.txt",
+                       ModTime:  time.Unix(1360600916, 0),
+                       Typeflag: TypeLink,
                },
+               fm: 0644,
+       }, {
                // More information.
-               {
-                       h: &Header{
-                               Name:     "info.txt",
-                               Mode:     0600 | c_ISREG,
-                               Size:     0,
-                               Uid:      1000,
-                               Gid:      1000,
-                               ModTime:  time.Unix(1360602540, 0),
-                               Uname:    "slartibartfast",
-                               Gname:    "users",
-                               Typeflag: TypeReg,
-                       },
-                       fm: 0600,
+               h: &Header{
+                       Name:     "info.txt",
+                       Mode:     0600 | c_ISREG,
+                       Size:     0,
+                       Uid:      1000,
+                       Gid:      1000,
+                       ModTime:  time.Unix(1360602540, 0),
+                       Uname:    "slartibartfast",
+                       Gname:    "users",
+                       Typeflag: TypeReg,
                },
-       }
+               fm: 0600,
+       }}
 
-       for i, g := range golden {
-               fi := g.h.FileInfo()
+       for i, v := range vectors {
+               fi := v.h.FileInfo()
                h2, err := FileInfoHeader(fi, "")
                if err != nil {
                        t.Error(err)
                        continue
                }
                if strings.Contains(fi.Name(), "/") {
-                       t.Errorf("FileInfo of %q contains slash: %q", g.h.Name, fi.Name())
+                       t.Errorf("FileInfo of %q contains slash: %q", v.h.Name, fi.Name())
                }
-               name := path.Base(g.h.Name)
+               name := path.Base(v.h.Name)
                if fi.IsDir() {
                        name += "/"
                }
                if got, want := h2.Name, name; got != want {
                        t.Errorf("i=%d: Name: got %v, want %v", i, got, want)
                }
-               if got, want := h2.Size, g.h.Size; got != want {
+               if got, want := h2.Size, v.h.Size; got != want {
                        t.Errorf("i=%d: Size: got %v, want %v", i, got, want)
                }
-               if got, want := h2.Uid, g.h.Uid; got != want {
+               if got, want := h2.Uid, v.h.Uid; got != want {
                        t.Errorf("i=%d: Uid: got %d, want %d", i, got, want)
                }
-               if got, want := h2.Gid, g.h.Gid; got != want {
+               if got, want := h2.Gid, v.h.Gid; got != want {
                        t.Errorf("i=%d: Gid: got %d, want %d", i, got, want)
                }
-               if got, want := h2.Uname, g.h.Uname; got != want {
+               if got, want := h2.Uname, v.h.Uname; got != want {
                        t.Errorf("i=%d: Uname: got %q, want %q", i, got, want)
                }
-               if got, want := h2.Gname, g.h.Gname; got != want {
+               if got, want := h2.Gname, v.h.Gname; got != want {
                        t.Errorf("i=%d: Gname: got %q, want %q", i, got, want)
                }
-               if got, want := h2.Linkname, g.h.Linkname; got != want {
+               if got, want := h2.Linkname, v.h.Linkname; got != want {
                        t.Errorf("i=%d: Linkname: got %v, want %v", i, got, want)
                }
-               if got, want := h2.Typeflag, g.h.Typeflag; got != want {
-                       t.Logf("%#v %#v", g.h, fi.Sys())
+               if got, want := h2.Typeflag, v.h.Typeflag; got != want {
+                       t.Logf("%#v %#v", v.h, fi.Sys())
                        t.Errorf("i=%d: Typeflag: got %q, want %q", i, got, want)
                }
-               if got, want := h2.Mode, g.h.Mode; got != want {
+               if got, want := h2.Mode, v.h.Mode; got != want {
                        t.Errorf("i=%d: Mode: got %o, want %o", i, got, want)
                }
-               if got, want := fi.Mode(), g.fm; got != want {
+               if got, want := fi.Mode(), v.fm; got != want {
                        t.Errorf("i=%d: fi.Mode: got %o, want %o", i, got, want)
                }
-               if got, want := h2.AccessTime, g.h.AccessTime; got != want {
+               if got, want := h2.AccessTime, v.h.AccessTime; got != want {
                        t.Errorf("i=%d: AccessTime: got %v, want %v", i, got, want)
                }
-               if got, want := h2.ChangeTime, g.h.ChangeTime; got != want {
+               if got, want := h2.ChangeTime, v.h.ChangeTime; got != want {
                        t.Errorf("i=%d: ChangeTime: got %v, want %v", i, got, want)
                }
-               if got, want := h2.ModTime, g.h.ModTime; got != want {
+               if got, want := h2.ModTime, v.h.ModTime; got != want {
                        t.Errorf("i=%d: ModTime: got %v, want %v", i, got, want)
                }
-               if sysh, ok := fi.Sys().(*Header); !ok || sysh != g.h {
+               if sysh, ok := fi.Sys().(*Header); !ok || sysh != v.h {
                        t.Errorf("i=%d: Sys didn't return original *Header", i)
                }
        }
index a4f3f4e43deac437edbb2ada693ce193fd82b3f7..678254dbc1bb8f22ff9b63ccf8bf51120fdaf159 100644 (file)
@@ -18,176 +18,6 @@ import (
        "time"
 )
 
-type writerTestEntry struct {
-       header   *Header
-       contents string
-}
-
-type writerTest struct {
-       file    string // filename of expected output
-       entries []*writerTestEntry
-}
-
-var writerTests = []*writerTest{
-       // The writer test file was produced with this command:
-       // tar (GNU tar) 1.26
-       //   ln -s small.txt link.txt
-       //   tar -b 1 --format=ustar -c -f writer.tar small.txt small2.txt link.txt
-       {
-               file: "testdata/writer.tar",
-               entries: []*writerTestEntry{
-                       {
-                               header: &Header{
-                                       Name:     "small.txt",
-                                       Mode:     0640,
-                                       Uid:      73025,
-                                       Gid:      5000,
-                                       Size:     5,
-                                       ModTime:  time.Unix(1246508266, 0),
-                                       Typeflag: '0',
-                                       Uname:    "dsymonds",
-                                       Gname:    "eng",
-                               },
-                               contents: "Kilts",
-                       },
-                       {
-                               header: &Header{
-                                       Name:     "small2.txt",
-                                       Mode:     0640,
-                                       Uid:      73025,
-                                       Gid:      5000,
-                                       Size:     11,
-                                       ModTime:  time.Unix(1245217492, 0),
-                                       Typeflag: '0',
-                                       Uname:    "dsymonds",
-                                       Gname:    "eng",
-                               },
-                               contents: "Google.com\n",
-                       },
-                       {
-                               header: &Header{
-                                       Name:     "link.txt",
-                                       Mode:     0777,
-                                       Uid:      1000,
-                                       Gid:      1000,
-                                       Size:     0,
-                                       ModTime:  time.Unix(1314603082, 0),
-                                       Typeflag: '2',
-                                       Linkname: "small.txt",
-                                       Uname:    "strings",
-                                       Gname:    "strings",
-                               },
-                               // no contents
-                       },
-               },
-       },
-       // The truncated test file was produced using these commands:
-       //   dd if=/dev/zero bs=1048576 count=16384 > /tmp/16gig.txt
-       //   tar -b 1 -c -f- /tmp/16gig.txt | dd bs=512 count=8 > writer-big.tar
-       {
-               file: "testdata/writer-big.tar",
-               entries: []*writerTestEntry{
-                       {
-                               header: &Header{
-                                       Name:     "tmp/16gig.txt",
-                                       Mode:     0640,
-                                       Uid:      73025,
-                                       Gid:      5000,
-                                       Size:     16 << 30,
-                                       ModTime:  time.Unix(1254699560, 0),
-                                       Typeflag: '0',
-                                       Uname:    "dsymonds",
-                                       Gname:    "eng",
-                               },
-                               // fake contents
-                               contents: strings.Repeat("\x00", 4<<10),
-                       },
-               },
-       },
-       // The truncated test file was produced using these commands:
-       //   dd if=/dev/zero bs=1048576 count=16384 > (longname/)*15 /16gig.txt
-       //   tar -b 1 -c -f- (longname/)*15 /16gig.txt | dd bs=512 count=8 > writer-big-long.tar
-       {
-               file: "testdata/writer-big-long.tar",
-               entries: []*writerTestEntry{
-                       {
-                               header: &Header{
-                                       Name:     strings.Repeat("longname/", 15) + "16gig.txt",
-                                       Mode:     0644,
-                                       Uid:      1000,
-                                       Gid:      1000,
-                                       Size:     16 << 30,
-                                       ModTime:  time.Unix(1399583047, 0),
-                                       Typeflag: '0',
-                                       Uname:    "guillaume",
-                                       Gname:    "guillaume",
-                               },
-                               // fake contents
-                               contents: strings.Repeat("\x00", 4<<10),
-                       },
-               },
-       },
-       // This file was produced using gnu tar 1.17
-       // gnutar  -b 4 --format=ustar (longname/)*15 + file.txt
-       {
-               file: "testdata/ustar.tar",
-               entries: []*writerTestEntry{
-                       {
-                               header: &Header{
-                                       Name:     strings.Repeat("longname/", 15) + "file.txt",
-                                       Mode:     0644,
-                                       Uid:      0765,
-                                       Gid:      024,
-                                       Size:     06,
-                                       ModTime:  time.Unix(1360135598, 0),
-                                       Typeflag: '0',
-                                       Uname:    "shane",
-                                       Gname:    "staff",
-                               },
-                               contents: "hello\n",
-                       },
-               },
-       },
-       // This file was produced using gnu tar 1.26
-       // echo "Slartibartfast" > file.txt
-       // ln file.txt hard.txt
-       // tar -b 1 --format=ustar -c -f hardlink.tar file.txt hard.txt
-       {
-               file: "testdata/hardlink.tar",
-               entries: []*writerTestEntry{
-                       {
-                               header: &Header{
-                                       Name:     "file.txt",
-                                       Mode:     0644,
-                                       Uid:      1000,
-                                       Gid:      100,
-                                       Size:     15,
-                                       ModTime:  time.Unix(1425484303, 0),
-                                       Typeflag: '0',
-                                       Uname:    "vbatts",
-                                       Gname:    "users",
-                               },
-                               contents: "Slartibartfast\n",
-                       },
-                       {
-                               header: &Header{
-                                       Name:     "hard.txt",
-                                       Mode:     0644,
-                                       Uid:      1000,
-                                       Gid:      100,
-                                       Size:     0,
-                                       ModTime:  time.Unix(1425484303, 0),
-                                       Typeflag: '1',
-                                       Linkname: "file.txt",
-                                       Uname:    "vbatts",
-                                       Gname:    "users",
-                               },
-                               // no contents
-                       },
-               },
-       },
-}
-
 // Render byte array in a two-character hexadecimal string, spaced for easy visual inspection.
 func bytestr(offset int, b []byte) string {
        const rowLen = 32
@@ -227,9 +57,158 @@ func bytediff(a []byte, b []byte) string {
 }
 
 func TestWriter(t *testing.T) {
+       type entry struct {
+               header   *Header
+               contents string
+       }
+
+       vectors := []struct {
+               file    string // filename of expected output
+               entries []*entry
+       }{{
+               // The writer test file was produced with this command:
+               // tar (GNU tar) 1.26
+               //   ln -s small.txt link.txt
+               //   tar -b 1 --format=ustar -c -f writer.tar small.txt small2.txt link.txt
+               file: "testdata/writer.tar",
+               entries: []*entry{{
+                       header: &Header{
+                               Name:     "small.txt",
+                               Mode:     0640,
+                               Uid:      73025,
+                               Gid:      5000,
+                               Size:     5,
+                               ModTime:  time.Unix(1246508266, 0),
+                               Typeflag: '0',
+                               Uname:    "dsymonds",
+                               Gname:    "eng",
+                       },
+                       contents: "Kilts",
+               }, {
+                       header: &Header{
+                               Name:     "small2.txt",
+                               Mode:     0640,
+                               Uid:      73025,
+                               Gid:      5000,
+                               Size:     11,
+                               ModTime:  time.Unix(1245217492, 0),
+                               Typeflag: '0',
+                               Uname:    "dsymonds",
+                               Gname:    "eng",
+                       },
+                       contents: "Google.com\n",
+               }, {
+                       header: &Header{
+                               Name:     "link.txt",
+                               Mode:     0777,
+                               Uid:      1000,
+                               Gid:      1000,
+                               Size:     0,
+                               ModTime:  time.Unix(1314603082, 0),
+                               Typeflag: '2',
+                               Linkname: "small.txt",
+                               Uname:    "strings",
+                               Gname:    "strings",
+                       },
+                       // no contents
+               }},
+       }, {
+               // The truncated test file was produced using these commands:
+               //   dd if=/dev/zero bs=1048576 count=16384 > /tmp/16gig.txt
+               //   tar -b 1 -c -f- /tmp/16gig.txt | dd bs=512 count=8 > writer-big.tar
+               file: "testdata/writer-big.tar",
+               entries: []*entry{{
+                       header: &Header{
+                               Name:     "tmp/16gig.txt",
+                               Mode:     0640,
+                               Uid:      73025,
+                               Gid:      5000,
+                               Size:     16 << 30,
+                               ModTime:  time.Unix(1254699560, 0),
+                               Typeflag: '0',
+                               Uname:    "dsymonds",
+                               Gname:    "eng",
+                       },
+                       // fake contents
+                       contents: strings.Repeat("\x00", 4<<10),
+               }},
+       }, {
+               // The truncated test file was produced using these commands:
+               //   dd if=/dev/zero bs=1048576 count=16384 > (longname/)*15 /16gig.txt
+               //   tar -b 1 -c -f- (longname/)*15 /16gig.txt | dd bs=512 count=8 > writer-big-long.tar
+               file: "testdata/writer-big-long.tar",
+               entries: []*entry{{
+                       header: &Header{
+                               Name:     strings.Repeat("longname/", 15) + "16gig.txt",
+                               Mode:     0644,
+                               Uid:      1000,
+                               Gid:      1000,
+                               Size:     16 << 30,
+                               ModTime:  time.Unix(1399583047, 0),
+                               Typeflag: '0',
+                               Uname:    "guillaume",
+                               Gname:    "guillaume",
+                       },
+                       // fake contents
+                       contents: strings.Repeat("\x00", 4<<10),
+               }},
+       }, {
+               // This file was produced using gnu tar 1.17
+               // gnutar  -b 4 --format=ustar (longname/)*15 + file.txt
+               file: "testdata/ustar.tar",
+               entries: []*entry{{
+                       header: &Header{
+                               Name:     strings.Repeat("longname/", 15) + "file.txt",
+                               Mode:     0644,
+                               Uid:      0765,
+                               Gid:      024,
+                               Size:     06,
+                               ModTime:  time.Unix(1360135598, 0),
+                               Typeflag: '0',
+                               Uname:    "shane",
+                               Gname:    "staff",
+                       },
+                       contents: "hello\n",
+               }},
+       }, {
+               // This file was produced using gnu tar 1.26
+               // echo "Slartibartfast" > file.txt
+               // ln file.txt hard.txt
+               // tar -b 1 --format=ustar -c -f hardlink.tar file.txt hard.txt
+               file: "testdata/hardlink.tar",
+               entries: []*entry{{
+                       header: &Header{
+                               Name:     "file.txt",
+                               Mode:     0644,
+                               Uid:      1000,
+                               Gid:      100,
+                               Size:     15,
+                               ModTime:  time.Unix(1425484303, 0),
+                               Typeflag: '0',
+                               Uname:    "vbatts",
+                               Gname:    "users",
+                       },
+                       contents: "Slartibartfast\n",
+               }, {
+                       header: &Header{
+                               Name:     "hard.txt",
+                               Mode:     0644,
+                               Uid:      1000,
+                               Gid:      100,
+                               Size:     0,
+                               ModTime:  time.Unix(1425484303, 0),
+                               Typeflag: '1',
+                               Linkname: "file.txt",
+                               Uname:    "vbatts",
+                               Gname:    "users",
+                       },
+                       // no contents
+               }},
+       }}
+
 testLoop:
-       for i, test := range writerTests {
-               expected, err := ioutil.ReadFile(test.file)
+       for i, v := range vectors {
+               expected, err := ioutil.ReadFile(v.file)
                if err != nil {
                        t.Errorf("test %d: Unexpected error: %v", i, err)
                        continue
@@ -238,7 +217,7 @@ testLoop:
                buf := new(bytes.Buffer)
                tw := NewWriter(iotest.TruncateWriter(buf, 4<<10)) // only catch the first 4 KB
                big := false
-               for j, entry := range test.entries {
+               for j, entry := range v.entries {
                        big = big || entry.header.Size > 1<<10
                        if err := tw.WriteHeader(entry.header); err != nil {
                                t.Errorf("test %d, entry %d: Failed writing header: %v", i, j, err)
@@ -575,9 +554,9 @@ func TestWriteAfterClose(t *testing.T) {
 }
 
 func TestSplitUSTARPath(t *testing.T) {
-       var sr = strings.Repeat
+       sr := strings.Repeat
 
-       var vectors = []struct {
+       vectors := []struct {
                input  string // Input path
                prefix string // Expected output prefix
                suffix string // Expected output suffix