github.com/kekek/gb@v0.4.5-0.20170222120241-d4ba64b0b297/internal/untar/untar_test.go (about)

     1  package untar
     2  
     3  import (
     4  	"compress/gzip"
     5  	"io"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"reflect"
    10  	"testing"
    11  )
    12  
    13  func TestUntar(t *testing.T) {
    14  	tests := []struct {
    15  		desc string
    16  		r    func(*testing.T) io.ReadCloser
    17  		dest string
    18  		want []string
    19  	}{{
    20  		desc: "a.tar.gz",
    21  		r:    tgz("_testdata/a.tar.gz"),
    22  		want: []string{
    23  			".",
    24  			"a",
    25  			"a/a",
    26  		},
    27  	}, {
    28  		desc: "errors.tar.gz",
    29  		r:    tgz("_testdata/errors.tar.gz"),
    30  		want: []string{
    31  			".",
    32  			"pkg-errors-805fb19",
    33  			"pkg-errors-805fb19/.gitignore",
    34  			"pkg-errors-805fb19/.travis.yml",
    35  			"pkg-errors-805fb19/LICENSE",
    36  			"pkg-errors-805fb19/README.md",
    37  			"pkg-errors-805fb19/appveyor.yml",
    38  			"pkg-errors-805fb19/errors.go",
    39  			"pkg-errors-805fb19/errors_test.go",
    40  			"pkg-errors-805fb19/example_test.go",
    41  			"pkg-errors-805fb19/format_test.go",
    42  			"pkg-errors-805fb19/stack.go",
    43  			"pkg-errors-805fb19/stack_test.go",
    44  		},
    45  	}, {
    46  		desc: "symlink.tar.gz",
    47  		r:    tgz("_testdata/symlink.tar.gz"),
    48  		want: []string{
    49  			".",
    50  			"symlink",
    51  			"symlink/a",
    52  			// no symlink/b
    53  		},
    54  	}}
    55  
    56  	for _, tt := range tests {
    57  		dest := tmpdir(t)
    58  		defer os.RemoveAll(dest)
    59  		r := tt.r(t)
    60  		defer r.Close()
    61  		err := Untar(dest, r)
    62  		if err != nil {
    63  			t.Error(err)
    64  			continue
    65  		}
    66  		got := walkdir(t, dest)
    67  		want := make([]string, len(tt.want))
    68  		for i := range tt.want {
    69  			want[i] = filepath.FromSlash(tt.want[i])
    70  		}
    71  		if !reflect.DeepEqual(got, want) {
    72  			t.Errorf("%s: untar: expected %s, got %s", tt.desc, want, got)
    73  		}
    74  	}
    75  }
    76  
    77  func tmpdir(t *testing.T) string {
    78  	dir, err := ioutil.TempDir("", ".test")
    79  	if err != nil {
    80  		t.Fatal(err)
    81  	}
    82  	return filepath.Join(dir, "dest")
    83  }
    84  
    85  func tgz(path string) func(t *testing.T) io.ReadCloser {
    86  	return func(t *testing.T) io.ReadCloser {
    87  		f, err := os.Open(path)
    88  		if err != nil {
    89  			t.Fatal(err)
    90  		}
    91  		r, err := gzip.NewReader(f)
    92  		if err != nil {
    93  			t.Fatal(err)
    94  		}
    95  		return r
    96  	}
    97  }
    98  
    99  func walkdir(t *testing.T, root string) []string {
   100  	var paths []string
   101  	err := filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
   102  		if err != nil {
   103  			return err
   104  		}
   105  		path, err = filepath.Rel(root, path)
   106  		paths = append(paths, path)
   107  		return err
   108  	})
   109  	if err != nil {
   110  		t.Fatal(err)
   111  	}
   112  	return paths
   113  }