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 }