1
// Copyright 2012 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
16
func TestFileInfoHeader(t *testing.T) {
17
fi, err := os.Stat("testdata/small.txt")
21
h, err := FileInfoHeader(fi, "")
23
t.Fatalf("FileInfoHeader: %v", err)
25
if g, e := h.Name, "small.txt"; g != e {
26
t.Errorf("Name = %q; want %q", g, e)
28
if g, e := h.Mode, int64(fi.Mode().Perm())|c_ISREG; g != e {
29
t.Errorf("Mode = %#o; want %#o", g, e)
31
if g, e := h.Size, int64(5); g != e {
32
t.Errorf("Size = %v; want %v", g, e)
34
if g, e := h.ModTime, fi.ModTime(); !g.Equal(e) {
35
t.Errorf("ModTime = %v; want %v", g, e)
39
func TestFileInfoHeaderDir(t *testing.T) {
40
fi, err := os.Stat("testdata")
44
h, err := FileInfoHeader(fi, "")
46
t.Fatalf("FileInfoHeader: %v", err)
48
if g, e := h.Name, "testdata/"; g != e {
49
t.Errorf("Name = %q; want %q", g, e)
51
// Ignoring c_ISGID for golang.org/issue/4867
52
if g, e := h.Mode&^c_ISGID, int64(fi.Mode().Perm())|c_ISDIR; g != e {
53
t.Errorf("Mode = %#o; want %#o", g, e)
55
if g, e := h.Size, int64(0); g != e {
56
t.Errorf("Size = %v; want %v", g, e)
58
if g, e := h.ModTime, fi.ModTime(); !g.Equal(e) {
59
t.Errorf("ModTime = %v; want %v", g, e)
63
func TestFileInfoHeaderSymlink(t *testing.T) {
64
h, err := FileInfoHeader(symlink{}, "some-target")
68
if g, e := h.Name, "some-symlink"; g != e {
69
t.Errorf("Name = %q; want %q", g, e)
71
if g, e := h.Linkname, "some-target"; g != e {
72
t.Errorf("Linkname = %q; want %q", g, e)
78
func (symlink) Name() string { return "some-symlink" }
79
func (symlink) Size() int64 { return 0 }
80
func (symlink) Mode() os.FileMode { return os.ModeSymlink }
81
func (symlink) ModTime() time.Time { return time.Time{} }
82
func (symlink) IsDir() bool { return false }
83
func (symlink) Sys() interface{} { return nil }
85
func TestRoundTrip(t *testing.T) {
86
data := []byte("some file contents")
92
Uid: 1 << 21, // too big for 8 octal digits
93
Size: int64(len(data)),
96
// tar only supports second precision.
97
hdr.ModTime = hdr.ModTime.Add(-time.Duration(hdr.ModTime.Nanosecond()) * time.Nanosecond)
98
if err := tw.WriteHeader(hdr); err != nil {
99
t.Fatalf("tw.WriteHeader: %v", err)
101
if _, err := tw.Write(data); err != nil {
102
t.Fatalf("tw.Write: %v", err)
104
if err := tw.Close(); err != nil {
105
t.Fatalf("tw.Close: %v", err)
110
rHdr, err := tr.Next()
112
t.Fatalf("tr.Next: %v", err)
114
if !reflect.DeepEqual(rHdr, hdr) {
115
t.Errorf("Header mismatch.\n got %+v\nwant %+v", rHdr, hdr)
117
rData, err := ioutil.ReadAll(tr)
119
t.Fatalf("Read: %v", err)
121
if !bytes.Equal(rData, data) {
122
t.Errorf("Data mismatch.\n got %q\nwant %q", rData, data)
126
type headerRoundTripTest struct {
131
func TestHeaderRoundTrip(t *testing.T) {
132
golden := []headerRoundTripTest{
137
Mode: 0644 | c_ISREG,
139
ModTime: time.Unix(1360600916, 0),
148
Mode: 0644 | c_ISLNK,
150
ModTime: time.Unix(1360600916, 0),
153
fm: 0644 | os.ModeSymlink,
159
Mode: 0777 | c_ISLNK,
161
ModTime: time.Unix(1360600852, 0),
162
Typeflag: TypeSymlink,
164
fm: 0777 | os.ModeSymlink,
166
// character device node.
170
Mode: 0666 | c_ISCHR,
172
ModTime: time.Unix(1360578951, 0),
175
fm: 0666 | os.ModeDevice | os.ModeCharDevice,
177
// block device node.
181
Mode: 0660 | c_ISBLK,
183
ModTime: time.Unix(1360578954, 0),
186
fm: 0660 | os.ModeDevice,
192
Mode: 0755 | c_ISDIR,
194
ModTime: time.Unix(1360601116, 0),
197
fm: 0755 | os.ModeDir,
203
Mode: 0600 | c_ISFIFO,
205
ModTime: time.Unix(1360578949, 0),
208
fm: 0600 | os.ModeNamedPipe,
214
Mode: 0755 | c_ISREG | c_ISUID,
216
ModTime: time.Unix(1355405093, 0),
219
fm: 0755 | os.ModeSetuid,
225
Mode: 0750 | c_ISREG | c_ISGID,
227
ModTime: time.Unix(1360602346, 0),
230
fm: 0750 | os.ModeSetgid,
236
Mode: 0600 | c_ISREG | c_ISVTX,
238
ModTime: time.Unix(1360602540, 0),
241
fm: 0600 | os.ModeSticky,
245
for i, g := range golden {
247
h2, err := FileInfoHeader(fi, "")
252
if got, want := h2.Name, g.h.Name; got != want {
253
t.Errorf("i=%d: Name: got %v, want %v", i, got, want)
255
if got, want := h2.Size, g.h.Size; got != want {
256
t.Errorf("i=%d: Size: got %v, want %v", i, got, want)
258
if got, want := h2.Mode, g.h.Mode; got != want {
259
t.Errorf("i=%d: Mode: got %o, want %o", i, got, want)
261
if got, want := fi.Mode(), g.fm; got != want {
262
t.Errorf("i=%d: fi.Mode: got %o, want %o", i, got, want)
264
if got, want := h2.ModTime, g.h.ModTime; got != want {
265
t.Errorf("i=%d: ModTime: got %v, want %v", i, got, want)
267
if sysh, ok := fi.Sys().(*Header); !ok || sysh != g.h {
268
t.Errorf("i=%d: Sys didn't return original *Header", i)