github.com/gsquire/gb@v0.4.4-0.20161112235727-3982dc872064/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 }