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  }