golang.org/x/build@v0.0.0-20240506185731-218518f32b70/tarutil/tarutil_test.go (about) 1 // Copyright 2015 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. 4 5 package tarutil 6 7 import ( 8 "archive/tar" 9 "compress/gzip" 10 "io" 11 "os" 12 "path" 13 "strings" 14 "testing" 15 "time" 16 ) 17 18 // fileInfo is an os.FileInfo implementation for tarHeader. 19 type fileInfo struct { 20 name string 21 mode os.FileMode 22 size int64 23 target string // if symlink 24 } 25 26 func (fi fileInfo) IsDir() bool { return fi.mode.IsDir() } 27 func (fi fileInfo) ModTime() time.Time { return time.Time{} } 28 func (fi fileInfo) Mode() os.FileMode { return fi.mode } 29 func (fi fileInfo) Name() string { return path.Base(fi.name) } 30 func (fi fileInfo) Size() int64 { return fi.size } 31 func (fi fileInfo) Sys() interface{} { return nil } 32 33 func tarHeader(t *testing.T, fi fileInfo) *tar.Header { 34 h, err := tar.FileInfoHeader(fi, fi.target) 35 if err != nil { 36 t.Fatalf("tarHeader: %v", err) 37 } 38 h.Name = fi.name // see docs on tar.FileInfoHeader 39 return h 40 } 41 42 func TestFileList(t *testing.T) { 43 fl := new(FileList) 44 45 fl.AddHeader(tarHeader(t, fileInfo{name: "symlink-file", target: "link-target", mode: 0644 | os.ModeSymlink})) 46 fl.AddRegular(tarHeader(t, fileInfo{name: "regular.txt", mode: 0644, size: 7}), 7, strings.NewReader("foo bar")) 47 48 tgz := fl.TarGz() 49 defer tgz.Close() 50 zr, err := gzip.NewReader(tgz) 51 if err != nil { 52 t.Fatalf("gzip.NewReader: %v", err) 53 } 54 tr := tar.NewReader(zr) 55 saw := 0 56 for { 57 h, err := tr.Next() 58 if err == io.EOF { 59 break 60 } 61 if err != nil { 62 t.Fatalf("tar.Reader.Next: %v", err) 63 } 64 saw++ 65 switch h.Name { 66 case "symlink-file": 67 case "regular.txt": 68 all, err := io.ReadAll(tr) 69 if err != nil { 70 t.Fatalf("Reading regular.txt: %v", err) 71 } 72 if string(all) != "foo bar" { 73 t.Errorf("regular.txt = %q; want \"foo bar\"", all) 74 } 75 default: 76 t.Fatalf("unknown name %q", h.Name) 77 } 78 } 79 if saw != 2 { 80 t.Errorf("number of entries = %d; want 2", saw) 81 } 82 }