gopkg.in/tcnksm/gcli.v0@v0.2.3/tests/helper_test.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os"
     7  	"os/exec"
     8  	"path/filepath"
     9  )
    10  
    11  const EnvGcliPath = "GCLI_PATH"
    12  
    13  // gcli is executable path
    14  var gcli string
    15  
    16  func init() {
    17  	gcli = os.Getenv(EnvGcliPath)
    18  	if gcli == "" {
    19  		gcli = "../bin/gcli"
    20  	}
    21  
    22  	// Should be absolute path so that we can change dir
    23  	var err error
    24  	gcli, err = filepath.Abs(gcli)
    25  	if err != nil {
    26  		panic(err)
    27  	}
    28  }
    29  
    30  // chdirSrcPath changes dirctory to $GOPATH/src/github.com/owner/
    31  // It returns cleanup script to delete directory
    32  func chdirSrcPath(owner string) (func(), error) {
    33  	gopath := os.Getenv("GOPATH")
    34  	if gopath == "" {
    35  		return nil, fmt.Errorf("can't found GOPATH env var")
    36  	}
    37  
    38  	srcPath := filepath.Join(gopath, "src", "github.com", owner)
    39  	if _, err := os.Stat(srcPath); os.IsExist(err) {
    40  		// TODO
    41  		panic(err)
    42  	}
    43  
    44  	if err := os.MkdirAll(srcPath, 0777); err != nil {
    45  		return nil, err
    46  	}
    47  
    48  	if err := os.Chdir(srcPath); err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	return func() {
    53  		if err := os.RemoveAll(srcPath); err != nil {
    54  			panic(err)
    55  		}
    56  	}, nil
    57  }
    58  
    59  // executeBin execute command and return output
    60  func executeBin(bin string, args []string) string {
    61  	var stdout, stderr bytes.Buffer
    62  	cmd := exec.Command("./"+bin, args...)
    63  	cmd.Stderr = &stderr
    64  	cmd.Stdout = &stdout
    65  
    66  	// cmd.Wait() returns error
    67  	_ = cmd.Run()
    68  	return stdout.String() + stderr.String()
    69  }
    70  
    71  // runGcli runs gcli and return its stdout. If failed, returns error.
    72  func runGcli(args []string) (string, error) {
    73  	var stdout, stderr bytes.Buffer
    74  	cmd := exec.Command(gcli, args...)
    75  	cmd.Stderr = &stderr
    76  	cmd.Stdout = &stdout
    77  
    78  	if err := cmd.Start(); err != nil {
    79  		return "", fmt.Errorf("failed to start: %s\n\n %s", err, stderr.String())
    80  	}
    81  
    82  	if err := cmd.Wait(); err != nil {
    83  		return "", fmt.Errorf("failed to execute: %s\n\n %s", err, stderr.String())
    84  	}
    85  
    86  	return stdout.String(), nil
    87  
    88  }
    89  
    90  func checkFile(files []string) error {
    91  
    92  	return nil
    93  }
    94  
    95  func goTests(output string) error {
    96  	// Change directory to artifact directory root
    97  	if err := os.Chdir(output); err != nil {
    98  		return err
    99  	}
   100  
   101  	defer func() {
   102  		// Back to src directory
   103  		if err := os.Chdir(".."); err != nil {
   104  			// Should not reach here
   105  			panic(err)
   106  		}
   107  	}()
   108  
   109  	funcs := []func(output string) error{
   110  		goGet,
   111  		goBuild,
   112  		goTest,
   113  		goVet,
   114  	}
   115  
   116  	for _, gf := range funcs {
   117  		err := gf(output)
   118  		if err != nil {
   119  			return err
   120  		}
   121  	}
   122  
   123  	return nil
   124  }
   125  
   126  // goGet runs go get on current directory. If failed, returns error.
   127  func goGet(output string) error {
   128  	var stdout, stderr bytes.Buffer
   129  	cmd := exec.Command("go", "get", "-v", "-d", "-t", "./...")
   130  	cmd.Stderr = &stderr
   131  	cmd.Stdout = &stdout
   132  
   133  	if err := cmd.Start(); err != nil {
   134  		return fmt.Errorf("failed to start `go get`: %s\n\n %s", err, stderr.String())
   135  	}
   136  
   137  	if err := cmd.Wait(); err != nil {
   138  		return fmt.Errorf("failed to execute `go get`: %s\n\n %s", err, stderr.String())
   139  	}
   140  
   141  	return nil
   142  }
   143  
   144  // goBuild runs go build on current directory. If failed, returns error.
   145  func goBuild(output string) error {
   146  	var stdout, stderr bytes.Buffer
   147  	cmd := exec.Command("go", "build", "-o", output)
   148  	cmd.Stderr = &stderr
   149  	cmd.Stdout = &stdout
   150  
   151  	if err := cmd.Start(); err != nil {
   152  		return fmt.Errorf("failed to start `go build`: %s\n\n %s", err, stderr.String())
   153  	}
   154  
   155  	if err := cmd.Wait(); err != nil {
   156  		return fmt.Errorf("failed to execute `go build`: %s\n\n %s", err, stderr.String())
   157  	}
   158  
   159  	return nil
   160  }
   161  
   162  // goTest runs go test on current directory. If failed, returns error.
   163  func goTest(output string) error {
   164  	var stdout, stderr bytes.Buffer
   165  	cmd := exec.Command("go", "test", "./...")
   166  	cmd.Stderr = &stderr
   167  	cmd.Stdout = &stdout
   168  
   169  	if err := cmd.Start(); err != nil {
   170  		return fmt.Errorf("failed to start `go test`: %s\n\n %s", err, stderr.String())
   171  	}
   172  
   173  	if err := cmd.Wait(); err != nil {
   174  		return fmt.Errorf("failed to execute `go test`: %s\n\n %s", err, stderr.String())
   175  	}
   176  
   177  	return nil
   178  }
   179  
   180  // goVet runs go vet on current directory. If failed, returns error.
   181  func goVet(output string) error {
   182  	var stdout, stderr bytes.Buffer
   183  	cmd := exec.Command("go", "vet", "./...")
   184  	cmd.Stderr = &stderr
   185  	cmd.Stdout = &stdout
   186  
   187  	if err := cmd.Start(); err != nil {
   188  		return fmt.Errorf("failed to start `go vet`: %s\n\n %s", err, stderr.String())
   189  	}
   190  
   191  	if err := cmd.Wait(); err != nil {
   192  		return fmt.Errorf("failed to execute `go vet`: %s\n\n %s", err, stderr.String())
   193  	}
   194  
   195  	return nil
   196  }