1*760c253cSXin Lidiff --git test/run.go test/run.go 2*760c253cSXin Liindex 22ec7576f8..ac5d3c3e8d 100644 3*760c253cSXin Li--- test/run.go 4*760c253cSXin Li+++ test/run.go 5*760c253cSXin Li@@ -39,9 +39,9 @@ var ( 6*760c253cSXin Li summary = flag.Bool("summary", false, "show summary of results") 7*760c253cSXin Li showSkips = flag.Bool("show_skips", false, "show skipped tests") 8*760c253cSXin Li runSkips = flag.Bool("run_skips", false, "run skipped tests (ignore skip and build tags)") 9*760c253cSXin Li- linkshared = flag.Bool("linkshared", false, "") 10*760c253cSXin Li updateErrors = flag.Bool("update_errors", false, "update error messages in test file based on compiler output") 11*760c253cSXin Li runoutputLimit = flag.Int("l", defaultRunOutputLimit(), "number of parallel runoutput tests to run") 12*760c253cSXin Li+ target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries") 13*760c253cSXin Li 14*760c253cSXin Li shard = flag.Int("shard", 0, "shard index to run. Only applicable if -shards is non-zero.") 15*760c253cSXin Li shards = flag.Int("shards", 0, "number of shards. If 0, all tests are run. This is used by the continuous build.") 16*760c253cSXin Li@@ -194,21 +194,15 @@ func goFiles(dir string) []string { 17*760c253cSXin Li type runCmd func(...string) ([]byte, error) 18*760c253cSXin Li 19*760c253cSXin Li func compileFile(runcmd runCmd, longname string, flags []string) (out []byte, err error) { 20*760c253cSXin Li- cmd := []string{"go", "tool", "compile", "-e"} 21*760c253cSXin Li+ cmd := []string{findGoCmd(), "tool", "compile", "-e"} 22*760c253cSXin Li cmd = append(cmd, flags...) 23*760c253cSXin Li- if *linkshared { 24*760c253cSXin Li- cmd = append(cmd, "-dynlink", "-installsuffix=dynlink") 25*760c253cSXin Li- } 26*760c253cSXin Li cmd = append(cmd, longname) 27*760c253cSXin Li return runcmd(cmd...) 28*760c253cSXin Li } 29*760c253cSXin Li 30*760c253cSXin Li func compileInDir(runcmd runCmd, dir string, flags []string, names ...string) (out []byte, err error) { 31*760c253cSXin Li- cmd := []string{"go", "tool", "compile", "-e", "-D", ".", "-I", "."} 32*760c253cSXin Li+ cmd := []string{findGoCmd(), "tool", "compile", "-e", "-D", ".", "-I", "."} 33*760c253cSXin Li cmd = append(cmd, flags...) 34*760c253cSXin Li- if *linkshared { 35*760c253cSXin Li- cmd = append(cmd, "-dynlink", "-installsuffix=dynlink") 36*760c253cSXin Li- } 37*760c253cSXin Li for _, name := range names { 38*760c253cSXin Li cmd = append(cmd, filepath.Join(dir, name)) 39*760c253cSXin Li } 40*760c253cSXin Li@@ -217,15 +211,24 @@ func compileInDir(runcmd runCmd, dir string, flags []string, names ...string) (o 41*760c253cSXin Li 42*760c253cSXin Li func linkFile(runcmd runCmd, goname string) (err error) { 43*760c253cSXin Li pfile := strings.Replace(goname, ".go", ".o", -1) 44*760c253cSXin Li- cmd := []string{"go", "tool", "link", "-w", "-o", "a.exe", "-L", "."} 45*760c253cSXin Li- if *linkshared { 46*760c253cSXin Li- cmd = append(cmd, "-linkshared", "-installsuffix=dynlink") 47*760c253cSXin Li- } 48*760c253cSXin Li- cmd = append(cmd, pfile) 49*760c253cSXin Li- _, err = runcmd(cmd...) 50*760c253cSXin Li+ cmd := []string{findGoCmd, "tool", "link", "-w", "-o", "a.exe", "-L", "."} 51*760c253cSXin Li+ _, err = runcmd(findGoCmd(), "tool", "link", "-w", "-o", "a.exe", "-L", ".", pfile) 52*760c253cSXin Li return 53*760c253cSXin Li } 54*760c253cSXin Li 55*760c253cSXin Li+ 56*760c253cSXin Li+func goRun(runcmd runCmd, flags []string, goname string, args ...string) (out []byte, err error) { 57*760c253cSXin Li+ cmd := []string{findGoCmd(), "run", goGcflags()} 58*760c253cSXin Li+ if len(findExecCmd()) > 0 { 59*760c253cSXin Li+ cmd = append(cmd, "-exec") 60*760c253cSXin Li+ cmd = append(cmd, findExecCmd()...) 61*760c253cSXin Li+ } 62*760c253cSXin Li+ cmd = append(cmd, flags...) 63*760c253cSXin Li+ cmd = append(cmd, goname) 64*760c253cSXin Li+ cmd = append(cmd, args...) 65*760c253cSXin Li+ return runcmd(cmd...) 66*760c253cSXin Li+} 67*760c253cSXin Li+ 68*760c253cSXin Li // skipError describes why a test was skipped. 69*760c253cSXin Li type skipError string 70*760c253cSXin Li 71*760c253cSXin Li@@ -595,7 +598,7 @@ func (t *test) run() { 72*760c253cSXin Li 73*760c253cSXin Li case "errorcheck": 74*760c253cSXin Li // TODO(gri) remove need for -C (disable printing of columns in error messages) 75*760c253cSXin Li- cmdline := []string{"go", "tool", "compile", "-C", "-e", "-o", "a.o"} 76*760c253cSXin Li+ cmdline := []string{findGoCmd(), "tool", "compile", "-C", "-e", "-o", "a.o"} 77*760c253cSXin Li // No need to add -dynlink even if linkshared if we're just checking for errors... 78*760c253cSXin Li cmdline = append(cmdline, flags...) 79*760c253cSXin Li cmdline = append(cmdline, long) 80*760c253cSXin Li@@ -709,7 +712,7 @@ func (t *test) run() { 81*760c253cSXin Li } 82*760c253cSXin Li 83*760c253cSXin Li case "build": 84*760c253cSXin Li- _, err := runcmd("go", "build", goGcflags(), "-o", "a.exe", long) 85*760c253cSXin Li+ _, err := runcmd(findGoCmd(), "build", goGcflags(), "-o", "a.exe", long) 86*760c253cSXin Li if err != nil { 87*760c253cSXin Li t.err = err 88*760c253cSXin Li } 89*760c253cSXin Li@@ -735,7 +738,7 @@ func (t *test) run() { 90*760c253cSXin Li 91*760c253cSXin Li } 92*760c253cSXin Li var objs []string 93*760c253cSXin Li- cmd := []string{"go", "tool", "compile", "-e", "-D", ".", "-I", ".", "-o", "go.o"} 94*760c253cSXin Li+ cmd := []string{findGoCmd(), "tool", "compile", "-e", "-D", ".", "-I", ".", "-o", "go.o"} 95*760c253cSXin Li if len(asms) > 0 { 96*760c253cSXin Li cmd = append(cmd, "-asmhdr", "go_asm.h") 97*760c253cSXin Li } 98*760c253cSXin Li@@ -749,7 +752,7 @@ func (t *test) run() { 99*760c253cSXin Li } 100*760c253cSXin Li objs = append(objs, "go.o") 101*760c253cSXin Li if len(asms) > 0 { 102*760c253cSXin Li- cmd = []string{"go", "tool", "asm", "-e", "-I", ".", "-o", "asm.o"} 103*760c253cSXin Li+ cmd = []string{findGoCmd(), "tool", "asm", "-e", "-I", ".", "-o", "asm.o"} 104*760c253cSXin Li for _, file := range asms { 105*760c253cSXin Li cmd = append(cmd, filepath.Join(longdir, file.Name())) 106*760c253cSXin Li } 107*760c253cSXin Li@@ -760,14 +763,14 @@ func (t *test) run() { 108*760c253cSXin Li } 109*760c253cSXin Li objs = append(objs, "asm.o") 110*760c253cSXin Li } 111*760c253cSXin Li- cmd = []string{"go", "tool", "pack", "c", "all.a"} 112*760c253cSXin Li+ cmd = []string{findGoCmd(), "tool", "pack", "c", "all.a"} 113*760c253cSXin Li cmd = append(cmd, objs...) 114*760c253cSXin Li _, err = runcmd(cmd...) 115*760c253cSXin Li if err != nil { 116*760c253cSXin Li t.err = err 117*760c253cSXin Li break 118*760c253cSXin Li } 119*760c253cSXin Li- cmd = []string{"go", "tool", "link", "all.a"} 120*760c253cSXin Li+ cmd = []string{findGoCmd(), "tool", "link", "-o", "a.exe", "all.a"} 121*760c253cSXin Li _, err = runcmd(cmd...) 122*760c253cSXin Li if err != nil { 123*760c253cSXin Li t.err = err 124*760c253cSXin Li@@ -777,10 +780,7 @@ func (t *test) run() { 125*760c253cSXin Li case "buildrun": // build binary, then run binary, instead of go run. Useful for timeout tests where failure mode is infinite loop. 126*760c253cSXin Li // TODO: not supported on NaCl 127*760c253cSXin Li useTmp = true 128*760c253cSXin Li- cmd := []string{"go", "build", goGcflags(), "-o", "a.exe"} 129*760c253cSXin Li- if *linkshared { 130*760c253cSXin Li- cmd = append(cmd, "-linkshared") 131*760c253cSXin Li- } 132*760c253cSXin Li+ cmd := []string{findGoCmd(), "build", goGcflags(), "-o", "a.exe"} 133*760c253cSXin Li longdirgofile := filepath.Join(filepath.Join(cwd, t.dir), t.gofile) 134*760c253cSXin Li cmd = append(cmd, flags...) 135*760c253cSXin Li cmd = append(cmd, longdirgofile) 136*760c253cSXin Li@@ -789,7 +789,12 @@ func (t *test) run() { 137*760c253cSXin Li t.err = err 138*760c253cSXin Li return 139*760c253cSXin Li } 140*760c253cSXin Li- cmd = []string{"./a.exe"} 141*760c253cSXin Li+ cmd = []string{} 142*760c253cSXin Li+ if len(findExecCmd()) > 0 { 143*760c253cSXin Li+ cmd = append(cmd, findExecCmd()...) 144*760c253cSXin Li+ } 145*760c253cSXin Li+ cmd = append(cmd, "./a.exe") 146*760c253cSXin Li+ 147*760c253cSXin Li out, err = runcmd(append(cmd, args...)...) 148*760c253cSXin Li if err != nil { 149*760c253cSXin Li t.err = err 150*760c253cSXin Li@@ -802,38 +807,7 @@ func (t *test) run() { 151*760c253cSXin Li 152*760c253cSXin Li case "run": 153*760c253cSXin Li useTmp = false 154*760c253cSXin Li- var out []byte 155*760c253cSXin Li- var err error 156*760c253cSXin Li- if len(flags)+len(args) == 0 && goGcflags() == "" && !*linkshared { 157*760c253cSXin Li- // If we're not using special go command flags, 158*760c253cSXin Li- // skip all the go command machinery. 159*760c253cSXin Li- // This avoids any time the go command would 160*760c253cSXin Li- // spend checking whether, for example, the installed 161*760c253cSXin Li- // package runtime is up to date. 162*760c253cSXin Li- // Because we run lots of trivial test programs, 163*760c253cSXin Li- // the time adds up. 164*760c253cSXin Li- pkg := filepath.Join(t.tempDir, "pkg.a") 165*760c253cSXin Li- if _, err := runcmd("go", "tool", "compile", "-o", pkg, t.goFileName()); err != nil { 166*760c253cSXin Li- t.err = err 167*760c253cSXin Li- return 168*760c253cSXin Li- } 169*760c253cSXin Li- exe := filepath.Join(t.tempDir, "test.exe") 170*760c253cSXin Li- cmd := []string{"go", "tool", "link", "-s", "-w"} 171*760c253cSXin Li- cmd = append(cmd, "-o", exe, pkg) 172*760c253cSXin Li- if _, err := runcmd(cmd...); err != nil { 173*760c253cSXin Li- t.err = err 174*760c253cSXin Li- return 175*760c253cSXin Li- } 176*760c253cSXin Li- out, err = runcmd(append([]string{exe}, args...)...) 177*760c253cSXin Li- } else { 178*760c253cSXin Li- cmd := []string{"go", "run", goGcflags()} 179*760c253cSXin Li- if *linkshared { 180*760c253cSXin Li- cmd = append(cmd, "-linkshared") 181*760c253cSXin Li- } 182*760c253cSXin Li- cmd = append(cmd, flags...) 183*760c253cSXin Li- cmd = append(cmd, t.goFileName()) 184*760c253cSXin Li- out, err = runcmd(append(cmd, args...)...) 185*760c253cSXin Li- } 186*760c253cSXin Li+ out, err := goRun(runcmd, flags, t.goFileName(), args...) 187*760c253cSXin Li if err != nil { 188*760c253cSXin Li t.err = err 189*760c253cSXin Li return 190*760c253cSXin Li@@ -848,12 +822,7 @@ func (t *test) run() { 191*760c253cSXin Li <-rungatec 192*760c253cSXin Li }() 193*760c253cSXin Li useTmp = false 194*760c253cSXin Li- cmd := []string{"go", "run", goGcflags()} 195*760c253cSXin Li- if *linkshared { 196*760c253cSXin Li- cmd = append(cmd, "-linkshared") 197*760c253cSXin Li- } 198*760c253cSXin Li- cmd = append(cmd, t.goFileName()) 199*760c253cSXin Li- out, err := runcmd(append(cmd, args...)...) 200*760c253cSXin Li+ out, err := goRun(runcmd, nil, t.goFileName(), args...) 201*760c253cSXin Li if err != nil { 202*760c253cSXin Li t.err = err 203*760c253cSXin Li return 204*760c253cSXin Li@@ -863,12 +832,7 @@ func (t *test) run() { 205*760c253cSXin Li t.err = fmt.Errorf("write tempfile:%s", err) 206*760c253cSXin Li return 207*760c253cSXin Li } 208*760c253cSXin Li- cmd = []string{"go", "run", goGcflags()} 209*760c253cSXin Li- if *linkshared { 210*760c253cSXin Li- cmd = append(cmd, "-linkshared") 211*760c253cSXin Li- } 212*760c253cSXin Li- cmd = append(cmd, tfile) 213*760c253cSXin Li- out, err = runcmd(cmd...) 214*760c253cSXin Li+ out, err = goRun(runcmd, nil, tfile) 215*760c253cSXin Li if err != nil { 216*760c253cSXin Li t.err = err 217*760c253cSXin Li return 218*760c253cSXin Li@@ -879,12 +843,7 @@ func (t *test) run() { 219*760c253cSXin Li 220*760c253cSXin Li case "errorcheckoutput": 221*760c253cSXin Li useTmp = false 222*760c253cSXin Li- cmd := []string{"go", "run", goGcflags()} 223*760c253cSXin Li- if *linkshared { 224*760c253cSXin Li- cmd = append(cmd, "-linkshared") 225*760c253cSXin Li- } 226*760c253cSXin Li- cmd = append(cmd, t.goFileName()) 227*760c253cSXin Li- out, err := runcmd(append(cmd, args...)...) 228*760c253cSXin Li+ out, err := goRun(runcmd, nil, t.goFileName(), args...) 229*760c253cSXin Li if err != nil { 230*760c253cSXin Li t.err = err 231*760c253cSXin Li return 232*760c253cSXin Li@@ -895,7 +854,7 @@ func (t *test) run() { 233*760c253cSXin Li t.err = fmt.Errorf("write tempfile:%s", err) 234*760c253cSXin Li return 235*760c253cSXin Li } 236*760c253cSXin Li- cmdline := []string{"go", "tool", "compile", "-e", "-o", "a.o"} 237*760c253cSXin Li+ cmdline := []string{findGoCmd(), "tool", "compile", "-e", "-o", "a.o"} 238*760c253cSXin Li cmdline = append(cmdline, flags...) 239*760c253cSXin Li cmdline = append(cmdline, tfile) 240*760c253cSXin Li out, err = runcmd(cmdline...) 241*760c253cSXin Li@@ -922,6 +881,11 @@ func findExecCmd() []string { 242*760c253cSXin Li return execCmd 243*760c253cSXin Li } 244*760c253cSXin Li execCmd = []string{} // avoid work the second time 245*760c253cSXin Li+ if *target != "" { 246*760c253cSXin Li+ execCmd = []string{"go_" + *target + "_exec"} 247*760c253cSXin Li+ return execCmd 248*760c253cSXin Li+ } 249*760c253cSXin Li+ 250*760c253cSXin Li if goos == runtime.GOOS && goarch == runtime.GOARCH { 251*760c253cSXin Li return execCmd 252*760c253cSXin Li } 253*760c253cSXin Li@@ -932,6 +896,14 @@ func findExecCmd() []string { 254*760c253cSXin Li return execCmd 255*760c253cSXin Li } 256*760c253cSXin Li 257*760c253cSXin Li+func findGoCmd() string { 258*760c253cSXin Li+ if *target != "" { 259*760c253cSXin Li+ return "go_" + *target 260*760c253cSXin Li+ } 261*760c253cSXin Li+ return "go" 262*760c253cSXin Li+} 263*760c253cSXin Li+ 264*760c253cSXin Li+ 265*760c253cSXin Li func (t *test) String() string { 266*760c253cSXin Li return filepath.Join(t.dir, t.gofile) 267*760c253cSXin Li } 268