Commit 04262986 authored by Joe Tsai's avatar Joe Tsai Committed by Joe Tsai

archive/tar: compact slices in tests

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: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 5378dd77
This diff is collapsed.
...@@ -135,190 +135,178 @@ type headerRoundTripTest struct { ...@@ -135,190 +135,178 @@ type headerRoundTripTest struct {
} }
func TestHeaderRoundTrip(t *testing.T) { func TestHeaderRoundTrip(t *testing.T) {
golden := []headerRoundTripTest{ vectors := []headerRoundTripTest{{
// regular file. // regular file.
{ h: &Header{
h: &Header{ Name: "test.txt",
Name: "test.txt", Mode: 0644 | c_ISREG,
Mode: 0644 | c_ISREG, Size: 12,
Size: 12, ModTime: time.Unix(1360600916, 0),
ModTime: time.Unix(1360600916, 0), Typeflag: TypeReg,
Typeflag: TypeReg,
},
fm: 0644,
}, },
fm: 0644,
}, {
// symbolic link. // symbolic link.
{ h: &Header{
h: &Header{ Name: "link.txt",
Name: "link.txt", Mode: 0777 | c_ISLNK,
Mode: 0777 | c_ISLNK, Size: 0,
Size: 0, ModTime: time.Unix(1360600852, 0),
ModTime: time.Unix(1360600852, 0), Typeflag: TypeSymlink,
Typeflag: TypeSymlink,
},
fm: 0777 | os.ModeSymlink,
}, },
fm: 0777 | os.ModeSymlink,
}, {
// character device node. // character device node.
{ h: &Header{
h: &Header{ Name: "dev/null",
Name: "dev/null", Mode: 0666 | c_ISCHR,
Mode: 0666 | c_ISCHR, Size: 0,
Size: 0, ModTime: time.Unix(1360578951, 0),
ModTime: time.Unix(1360578951, 0), Typeflag: TypeChar,
Typeflag: TypeChar,
},
fm: 0666 | os.ModeDevice | os.ModeCharDevice,
}, },
fm: 0666 | os.ModeDevice | os.ModeCharDevice,
}, {
// block device node. // block device node.
{ h: &Header{
h: &Header{ Name: "dev/sda",
Name: "dev/sda", Mode: 0660 | c_ISBLK,
Mode: 0660 | c_ISBLK, Size: 0,
Size: 0, ModTime: time.Unix(1360578954, 0),
ModTime: time.Unix(1360578954, 0), Typeflag: TypeBlock,
Typeflag: TypeBlock,
},
fm: 0660 | os.ModeDevice,
}, },
fm: 0660 | os.ModeDevice,
}, {
// directory. // directory.
{ h: &Header{
h: &Header{ Name: "dir/",
Name: "dir/", Mode: 0755 | c_ISDIR,
Mode: 0755 | c_ISDIR, Size: 0,
Size: 0, ModTime: time.Unix(1360601116, 0),
ModTime: time.Unix(1360601116, 0), Typeflag: TypeDir,
Typeflag: TypeDir,
},
fm: 0755 | os.ModeDir,
}, },
fm: 0755 | os.ModeDir,
}, {
// fifo node. // fifo node.
{ h: &Header{
h: &Header{ Name: "dev/initctl",
Name: "dev/initctl", Mode: 0600 | c_ISFIFO,
Mode: 0600 | c_ISFIFO, Size: 0,
Size: 0, ModTime: time.Unix(1360578949, 0),
ModTime: time.Unix(1360578949, 0), Typeflag: TypeFifo,
Typeflag: TypeFifo,
},
fm: 0600 | os.ModeNamedPipe,
}, },
fm: 0600 | os.ModeNamedPipe,
}, {
// setuid. // setuid.
{ h: &Header{
h: &Header{ Name: "bin/su",
Name: "bin/su", Mode: 0755 | c_ISREG | c_ISUID,
Mode: 0755 | c_ISREG | c_ISUID, Size: 23232,
Size: 23232, ModTime: time.Unix(1355405093, 0),
ModTime: time.Unix(1355405093, 0), Typeflag: TypeReg,
Typeflag: TypeReg,
},
fm: 0755 | os.ModeSetuid,
}, },
fm: 0755 | os.ModeSetuid,
}, {
// setguid. // setguid.
{ h: &Header{
h: &Header{ Name: "group.txt",
Name: "group.txt", Mode: 0750 | c_ISREG | c_ISGID,
Mode: 0750 | c_ISREG | c_ISGID, Size: 0,
Size: 0, ModTime: time.Unix(1360602346, 0),
ModTime: time.Unix(1360602346, 0), Typeflag: TypeReg,
Typeflag: TypeReg,
},
fm: 0750 | os.ModeSetgid,
}, },
fm: 0750 | os.ModeSetgid,
}, {
// sticky. // sticky.
{ h: &Header{
h: &Header{ Name: "sticky.txt",
Name: "sticky.txt", Mode: 0600 | c_ISREG | c_ISVTX,
Mode: 0600 | c_ISREG | c_ISVTX, Size: 7,
Size: 7, ModTime: time.Unix(1360602540, 0),
ModTime: time.Unix(1360602540, 0), Typeflag: TypeReg,
Typeflag: TypeReg,
},
fm: 0600 | os.ModeSticky,
}, },
fm: 0600 | os.ModeSticky,
}, {
// hard link. // hard link.
{ h: &Header{
h: &Header{ Name: "hard.txt",
Name: "hard.txt", Mode: 0644 | c_ISREG,
Mode: 0644 | c_ISREG, Size: 0,
Size: 0, Linkname: "file.txt",
Linkname: "file.txt", ModTime: time.Unix(1360600916, 0),
ModTime: time.Unix(1360600916, 0), Typeflag: TypeLink,
Typeflag: TypeLink,
},
fm: 0644,
}, },
fm: 0644,
}, {
// More information. // More information.
{ h: &Header{
h: &Header{ Name: "info.txt",
Name: "info.txt", Mode: 0600 | c_ISREG,
Mode: 0600 | c_ISREG, Size: 0,
Size: 0, Uid: 1000,
Uid: 1000, Gid: 1000,
Gid: 1000, ModTime: time.Unix(1360602540, 0),
ModTime: time.Unix(1360602540, 0), Uname: "slartibartfast",
Uname: "slartibartfast", Gname: "users",
Gname: "users", Typeflag: TypeReg,
Typeflag: TypeReg,
},
fm: 0600,
}, },
} fm: 0600,
}}
for i, g := range golden { for i, v := range vectors {
fi := g.h.FileInfo() fi := v.h.FileInfo()
h2, err := FileInfoHeader(fi, "") h2, err := FileInfoHeader(fi, "")
if err != nil { if err != nil {
t.Error(err) t.Error(err)
continue continue
} }
if strings.Contains(fi.Name(), "/") { 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() { if fi.IsDir() {
name += "/" name += "/"
} }
if got, want := h2.Name, name; got != want { if got, want := h2.Name, name; got != want {
t.Errorf("i=%d: Name: got %v, want %v", i, 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) 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) 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) 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) 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) 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) t.Errorf("i=%d: Linkname: got %v, want %v", i, got, want)
} }
if got, want := h2.Typeflag, g.h.Typeflag; got != want { if got, want := h2.Typeflag, v.h.Typeflag; got != want {
t.Logf("%#v %#v", g.h, fi.Sys()) t.Logf("%#v %#v", v.h, fi.Sys())
t.Errorf("i=%d: Typeflag: got %q, want %q", i, got, want) 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) 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) 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) 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) 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) 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) t.Errorf("i=%d: Sys didn't return original *Header", i)
} }
} }
......
...@@ -18,176 +18,6 @@ import ( ...@@ -18,176 +18,6 @@ import (
"time" "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. // Render byte array in a two-character hexadecimal string, spaced for easy visual inspection.
func bytestr(offset int, b []byte) string { func bytestr(offset int, b []byte) string {
const rowLen = 32 const rowLen = 32
...@@ -227,9 +57,158 @@ func bytediff(a []byte, b []byte) string { ...@@ -227,9 +57,158 @@ func bytediff(a []byte, b []byte) string {
} }
func TestWriter(t *testing.T) { 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: testLoop:
for i, test := range writerTests { for i, v := range vectors {
expected, err := ioutil.ReadFile(test.file) expected, err := ioutil.ReadFile(v.file)
if err != nil { if err != nil {
t.Errorf("test %d: Unexpected error: %v", i, err) t.Errorf("test %d: Unexpected error: %v", i, err)
continue continue
...@@ -238,7 +217,7 @@ testLoop: ...@@ -238,7 +217,7 @@ testLoop:
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
tw := NewWriter(iotest.TruncateWriter(buf, 4<<10)) // only catch the first 4 KB tw := NewWriter(iotest.TruncateWriter(buf, 4<<10)) // only catch the first 4 KB
big := false big := false
for j, entry := range test.entries { for j, entry := range v.entries {
big = big || entry.header.Size > 1<<10 big = big || entry.header.Size > 1<<10
if err := tw.WriteHeader(entry.header); err != nil { if err := tw.WriteHeader(entry.header); err != nil {
t.Errorf("test %d, entry %d: Failed writing header: %v", i, j, err) t.Errorf("test %d, entry %d: Failed writing header: %v", i, j, err)
...@@ -575,9 +554,9 @@ func TestWriteAfterClose(t *testing.T) { ...@@ -575,9 +554,9 @@ func TestWriteAfterClose(t *testing.T) {
} }
func TestSplitUSTARPath(t *testing.T) { func TestSplitUSTARPath(t *testing.T) {
var sr = strings.Repeat sr := strings.Repeat
var vectors = []struct { vectors := []struct {
input string // Input path input string // Input path
prefix string // Expected output prefix prefix string // Expected output prefix
suffix string // Expected output suffix suffix string // Expected output suffix
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment