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  }