github.com/golang/dep@v0.5.4/gps/maybe_source_test.go (about) 1 // Copyright 2018 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 gps 6 7 import ( 8 "archive/tar" 9 "compress/gzip" 10 "context" 11 "io" 12 "io/ioutil" 13 "net/url" 14 "os" 15 "path/filepath" 16 "testing" 17 18 "github.com/Masterminds/vcs" 19 ) 20 21 func TestMaybeGitSource_try(t *testing.T) { 22 t.Parallel() 23 24 tempDir, err := ioutil.TempDir("", "go-try-happy-test") 25 if err != nil { 26 t.Fatal(err) 27 } 28 defer func() { 29 err = os.RemoveAll(tempDir) 30 if err != nil { 31 t.Error(err) 32 } 33 }() 34 35 url, err := url.Parse(gitRemoteTestRepo) 36 if err != nil { 37 t.Fatal(err) 38 } 39 var ms maybeSource = maybeGitSource{url: url} 40 _, err = ms.try(context.Background(), tempDir) 41 if err != nil { 42 t.Fatal(err) 43 } 44 } 45 46 func TestMaybeGitSource_try_recovery(t *testing.T) { 47 t.Parallel() 48 49 tempDir, err := ioutil.TempDir("", "go-try-recovery-test") 50 if err != nil { 51 t.Fatal(err) 52 } 53 defer func() { 54 err = os.RemoveAll(tempDir) 55 if err != nil { 56 t.Error(err) 57 } 58 }() 59 60 cwd, err := os.Getwd() 61 if err != nil { 62 t.Fatal(err) 63 } 64 65 src := filepath.Join(cwd, "_testdata", "badrepo", "corrupt_dot_git_directory.tar") 66 f, err := os.Open(src) 67 if err != nil { 68 t.Fatal(err) 69 } 70 defer f.Close() 71 72 dest := filepath.Join(tempDir, ".git") 73 err = untar(dest, f) 74 if err != nil { 75 t.Fatalf("could not untar corrupt repo into temp folder: %v\n", err) 76 } 77 78 _, err = vcs.NewGitRepo(gitRemoteTestRepo, tempDir) 79 if err != nil { 80 if _, ok := err.(*vcs.LocalError); !ok { 81 t.Fatalf("expected a local error but got: %v\n", err) 82 } 83 } else { 84 t.Fatal("expected getVCSRepo to fail when pointing to a corrupt local path. It is possible that vcs.GitNewRepo updated to gracefully handle this test scenario. Check the return of vcs.GitNewRepo.") 85 } 86 87 url, err := url.Parse(gitRemoteTestRepo) 88 if err != nil { 89 t.Fatal(err) 90 } 91 var ms maybeSource = maybeGitSource{url: url} 92 _, err = ms.try(context.Background(), tempDir) 93 if err != nil { 94 t.Fatal(err) 95 } 96 } 97 98 func untar(dst string, r io.Reader) error { 99 gzr, err := gzip.NewReader(r) 100 if err != nil { 101 return err 102 } 103 defer gzr.Close() 104 105 tr := tar.NewReader(gzr) 106 107 for { 108 header, err := tr.Next() 109 110 switch { 111 case err == io.EOF: 112 return nil 113 case err != nil: 114 return err 115 case header == nil: 116 continue 117 } 118 119 target := filepath.Join(dst, header.Name) 120 switch header.Typeflag { 121 case tar.TypeDir: 122 if _, err := os.Stat(target); err != nil { 123 if err := os.MkdirAll(target, 0755); err != nil { 124 return err 125 } 126 } 127 case tar.TypeReg: 128 f, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode)) 129 if err != nil { 130 return err 131 } 132 defer f.Close() 133 134 if _, err := io.Copy(f, tr); err != nil { 135 return err 136 } 137 } 138 } 139 }