1*760c253cSXin Lidiff --git test/run.go test/run.go 2*760c253cSXin Liindex ad38d420c9..e2b93d35da 100644 3*760c253cSXin Li--- test/run.go 4*760c253cSXin Li+++ test/run.go 5*760c253cSXin Li@@ -36,13 +36,13 @@ 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 13*760c253cSXin Li shard = flag.Int("shard", 0, "shard index to run. Only applicable if -shards is non-zero.") 14*760c253cSXin Li shards = flag.Int("shards", 0, "number of shards. If 0, all tests are run. This is used by the continuous build.") 15*760c253cSXin Li ) 16*760c253cSXin Li+ target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries") 17*760c253cSXin Li 18*760c253cSXin Li var ( 19*760c253cSXin Li goos, goarch string 20*760c253cSXin Li@@ -207,25 +207,19 @@ func goFiles(dir string) []string { 21*760c253cSXin Li type runCmd func(...string) ([]byte, error) 22*760c253cSXin Li 23*760c253cSXin Li func compileFile(runcmd runCmd, longname string, flags []string) (out []byte, err error) { 24*760c253cSXin Li- cmd := []string{goTool(), "tool", "compile", "-e"} 25*760c253cSXin Li+ cmd := []string{findGoCmd, "tool", "compile", "-e"} 26*760c253cSXin Li cmd = append(cmd, flags...) 27*760c253cSXin Li- if *linkshared { 28*760c253cSXin Li- cmd = append(cmd, "-dynlink", "-installsuffix=dynlink") 29*760c253cSXin Li- } 30*760c253cSXin Li cmd = append(cmd, longname) 31*760c253cSXin Li return runcmd(cmd...) 32*760c253cSXin Li } 33*760c253cSXin Li 34*760c253cSXin Li func compileInDir(runcmd runCmd, dir string, flags []string, localImports bool, names ...string) (out []byte, err error) { 35*760c253cSXin Li- cmd := []string{goTool(), "tool", "compile", "-e"} 36*760c253cSXin Li+ cmd := []string{findGoCmd(), "tool", "compile", "-e"} 37*760c253cSXin Li if localImports { 38*760c253cSXin Li // Set relative path for local imports and import search path to current dir. 39*760c253cSXin Li cmd = append(cmd, "-D", ".", "-I", ".") 40*760c253cSXin Li } 41*760c253cSXin Li cmd = append(cmd, flags...) 42*760c253cSXin Li- if *linkshared { 43*760c253cSXin Li- cmd = append(cmd, "-dynlink", "-installsuffix=dynlink") 44*760c253cSXin Li- } 45*760c253cSXin Li for _, name := range names { 46*760c253cSXin Li cmd = append(cmd, filepath.Join(dir, name)) 47*760c253cSXin Li } 48*760c253cSXin Li@@ -234,15 +228,28 @@ func compileInDir(runcmd runCmd, dir string, flags []string, localImports bool, 49*760c253cSXin Li 50*760c253cSXin Li func linkFile(runcmd runCmd, goname string) (err error) { 51*760c253cSXin Li pfile := strings.Replace(goname, ".go", ".o", -1) 52*760c253cSXin Li- cmd := []string{goTool(), "tool", "link", "-w", "-o", "a.exe", "-L", "."} 53*760c253cSXin Li+ cmd := []string{findGoCmd(), "tool", "link", "-w", "-o", "a.exe", "-L", "."} 54*760c253cSXin Li if *linkshared { 55*760c253cSXin Li cmd = append(cmd, "-linkshared", "-installsuffix=dynlink") 56*760c253cSXin Li } 57*760c253cSXin Li cmd = append(cmd, pfile) 58*760c253cSXin Li- _, err = runcmd(cmd...) 59*760c253cSXin Li+ _, err = runcmd(findGoCmd(), "tool", "link", "-w", "-o", "a.exe", "-L", ".", pfile) 60*760c253cSXin Li return 61*760c253cSXin Li } 62*760c253cSXin Li 63*760c253cSXin Li+ 64*760c253cSXin Li+func goRun(runcmd runCmd, flags []string, goname string, args ...string) (out []byte, err error) { 65*760c253cSXin Li+ cmd := []string{findGoCmd(), "run", goGcflags()} 66*760c253cSXin Li+ if len(findExecCmd()) > 0 { 67*760c253cSXin Li+ cmd = append(cmd, "-exec") 68*760c253cSXin Li+ cmd = append(cmd, findExecCmd()...) 69*760c253cSXin Li+ } 70*760c253cSXin Li+ cmd = append(cmd, flags...) 71*760c253cSXin Li+ cmd = append(cmd, goname) 72*760c253cSXin Li+ cmd = append(cmd, args...) 73*760c253cSXin Li+ return runcmd(cmd...) 74*760c253cSXin Li+} 75*760c253cSXin Li+ 76*760c253cSXin Li // skipError describes why a test was skipped. 77*760c253cSXin Li type skipError string 78*760c253cSXin Li 79*760c253cSXin Li@@ -646,7 +653,7 @@ func (t *test) run() { 80*760c253cSXin Li // Fail if wantError is true and compilation was successful and vice versa. 81*760c253cSXin Li // Match errors produced by gc against errors in comments. 82*760c253cSXin Li // TODO(gri) remove need for -C (disable printing of columns in error messages) 83*760c253cSXin Li- cmdline := []string{goTool(), "tool", "compile", "-C", "-e", "-o", "a.o"} 84*760c253cSXin Li+ cmdline := []string{findGoCmd(), "tool", "compile", "-C", "-e", "-o", "a.o"} 85*760c253cSXin Li // No need to add -dynlink even if linkshared if we're just checking for errors... 86*760c253cSXin Li cmdline = append(cmdline, flags...) 87*760c253cSXin Li cmdline = append(cmdline, long) 88*760c253cSXin Li@@ -773,7 +780,7 @@ func (t *test) run() { 89*760c253cSXin Li 90*760c253cSXin Li case "build": 91*760c253cSXin Li // Build Go file. 92*760c253cSXin Li- _, err := runcmd(goTool(), "build", goGcflags(), "-o", "a.exe", long) 93*760c253cSXin Li+ _, err := runcmd(findGoCmd(), "build", goGcflags(), "-o", "a.exe", long) 94*760c253cSXin Li if err != nil { 95*760c253cSXin Li t.err = err 96*760c253cSXin Li } 97*760c253cSXin Li@@ -799,7 +806,7 @@ func (t *test) run() { 98*760c253cSXin Li 99*760c253cSXin Li } 100*760c253cSXin Li var objs []string 101*760c253cSXin Li- cmd := []string{goTool(), "tool", "compile", "-e", "-D", ".", "-I", ".", "-o", "go.o"} 102*760c253cSXin Li+ cmd := []string{findGoCmd(), "tool", "compile", "-e", "-D", ".", "-I", ".", "-o", "go.o"} 103*760c253cSXin Li if len(asms) > 0 { 104*760c253cSXin Li cmd = append(cmd, "-asmhdr", "go_asm.h") 105*760c253cSXin Li } 106*760c253cSXin Li@@ -813,7 +820,7 @@ func (t *test) run() { 107*760c253cSXin Li } 108*760c253cSXin Li objs = append(objs, "go.o") 109*760c253cSXin Li if len(asms) > 0 { 110*760c253cSXin Li- cmd = []string{goTool(), "tool", "asm", "-e", "-I", ".", "-o", "asm.o"} 111*760c253cSXin Li+ cmd = []string{findGoCmd(), "tool", "asm", "-e", "-I", ".", "-o", "asm.o"} 112*760c253cSXin Li for _, file := range asms { 113*760c253cSXin Li cmd = append(cmd, filepath.Join(longdir, file.Name())) 114*760c253cSXin Li } 115*760c253cSXin Li@@ -857,14 +864,14 @@ func (t *test) run() { 116*760c253cSXin Li } 117*760c253cSXin Li objs = append(objs, "asm.o") 118*760c253cSXin Li } 119*760c253cSXin Li- cmd = []string{goTool(), "tool", "pack", "c", "all.a"} 120*760c253cSXin Li+ cmd = []string{findGoCmd(), "tool", "pack", "c", "all.a"} 121*760c253cSXin Li cmd = append(cmd, objs...) 122*760c253cSXin Li _, err = runcmd(cmd...) 123*760c253cSXin Li if err != nil { 124*760c253cSXin Li t.err = err 125*760c253cSXin Li break 126*760c253cSXin Li } 127*760c253cSXin Li- cmd = []string{goTool(), "tool", "link", "-o", "a.exe", "all.a"} 128*760c253cSXin Li+ cmd = []string{findGoCmd(), "tool", "link", "-o", "a.exe", "all.a"} 129*760c253cSXin Li _, err = runcmd(cmd...) 130*760c253cSXin Li if err != nil { 131*760c253cSXin Li t.err = err 132*760c253cSXin Li@@ -886,10 +893,7 @@ func (t *test) run() { 133*760c253cSXin Li // Build an executable from Go file, then run it, verify its output. 134*760c253cSXin Li // Useful for timeout tests where failure mode is infinite loop. 135*760c253cSXin Li // TODO: not supported on NaCl 136*760c253cSXin Li- cmd := []string{goTool(), "build", goGcflags(), "-o", "a.exe"} 137*760c253cSXin Li- if *linkshared { 138*760c253cSXin Li- cmd = append(cmd, "-linkshared") 139*760c253cSXin Li- } 140*760c253cSXin Li+ cmd := []string{findGoCmd(), "build", goGcflags(), "-o", "a.exe"} 141*760c253cSXin Li longdirgofile := filepath.Join(filepath.Join(cwd, t.dir), t.gofile) 142*760c253cSXin Li cmd = append(cmd, flags...) 143*760c253cSXin Li cmd = append(cmd, longdirgofile) 144*760c253cSXin Li@@ -898,8 +902,13 @@ func (t *test) run() { 145*760c253cSXin Li t.err = err 146*760c253cSXin Li return 147*760c253cSXin Li } 148*760c253cSXin Li- cmd = []string{"./a.exe"} 149*760c253cSXin Li- out, err = runcmd(append(cmd, args...)...) 150*760c253cSXin Li+ cmd = []string{} 151*760c253cSXin Li+ if len(findExecCmd()) > 0 { 152*760c253cSXin Li+ cmd = append(cmd, findExecCmd()...) 153*760c253cSXin Li+ } 154*760c253cSXin Li+ cmd = append(cmd, "./a.exe") 155*760c253cSXin Li+ 156*760c253cSXin Li+ out, err = runcmd(append(cmd, args...)...) 157*760c253cSXin Li if err != nil { 158*760c253cSXin Li t.err = err 159*760c253cSXin Li return 160*760c253cSXin Li@@ -914,38 +923,7 @@ func (t *test) run() { 161*760c253cSXin Li // otherwise build an executable and run it. 162*760c253cSXin Li // Verify the output. 163*760c253cSXin Li useTmp = false 164*760c253cSXin Li- var out []byte 165*760c253cSXin Li- var err error 166*760c253cSXin Li- if len(flags)+len(args) == 0 && goGcflags() == "" && !*linkshared { 167*760c253cSXin Li- // If we're not using special go command flags, 168*760c253cSXin Li- // skip all the go command machinery. 169*760c253cSXin Li- // This avoids any time the go command would 170*760c253cSXin Li- // spend checking whether, for example, the installed 171*760c253cSXin Li- // package runtime is up to date. 172*760c253cSXin Li- // Because we run lots of trivial test programs, 173*760c253cSXin Li- // the time adds up. 174*760c253cSXin Li- pkg := filepath.Join(t.tempDir, "pkg.a") 175*760c253cSXin Li- if _, err := runcmd(goTool(), "tool", "compile", "-o", pkg, t.goFileName()); err != nil { 176*760c253cSXin Li- t.err = err 177*760c253cSXin Li- return 178*760c253cSXin Li- } 179*760c253cSXin Li- exe := filepath.Join(t.tempDir, "test.exe") 180*760c253cSXin Li- cmd := []string{goTool(), "tool", "link", "-s", "-w"} 181*760c253cSXin Li- cmd = append(cmd, "-o", exe, pkg) 182*760c253cSXin Li- if _, err := runcmd(cmd...); err != nil { 183*760c253cSXin Li- t.err = err 184*760c253cSXin Li- return 185*760c253cSXin Li- } 186*760c253cSXin Li- out, err = runcmd(append([]string{exe}, args...)...) 187*760c253cSXin Li- } else { 188*760c253cSXin Li- cmd := []string{goTool(), "run", goGcflags()} 189*760c253cSXin Li- if *linkshared { 190*760c253cSXin Li- cmd = append(cmd, "-linkshared") 191*760c253cSXin Li- } 192*760c253cSXin Li- cmd = append(cmd, flags...) 193*760c253cSXin Li- cmd = append(cmd, t.goFileName()) 194*760c253cSXin Li- out, err = runcmd(append(cmd, args...)...) 195*760c253cSXin Li- } 196*760c253cSXin Li+ out, err := goRun(runcmd, flags, t.goFileName(), args...) 197*760c253cSXin Li if err != nil { 198*760c253cSXin Li t.err = err 199*760c253cSXin Li return 200*760c253cSXin Li@@ -962,12 +940,7 @@ func (t *test) run() { 201*760c253cSXin Li <-rungatec 202*760c253cSXin Li }() 203*760c253cSXin Li useTmp = false 204*760c253cSXin Li- cmd := []string{goTool(), "run", goGcflags()} 205*760c253cSXin Li- if *linkshared { 206*760c253cSXin Li- cmd = append(cmd, "-linkshared") 207*760c253cSXin Li- } 208*760c253cSXin Li- cmd = append(cmd, t.goFileName()) 209*760c253cSXin Li- out, err := runcmd(append(cmd, args...)...) 210*760c253cSXin Li+ out, err := goRun(runcmd, nil, t.goFileName(), args...) 211*760c253cSXin Li if err != nil { 212*760c253cSXin Li t.err = err 213*760c253cSXin Li return 214*760c253cSXin Li@@ -977,12 +950,7 @@ func (t *test) run() { 215*760c253cSXin Li t.err = fmt.Errorf("write tempfile:%s", err) 216*760c253cSXin Li return 217*760c253cSXin Li } 218*760c253cSXin Li- cmd = []string{goTool(), "run", goGcflags()} 219*760c253cSXin Li- if *linkshared { 220*760c253cSXin Li- cmd = append(cmd, "-linkshared") 221*760c253cSXin Li- } 222*760c253cSXin Li- cmd = append(cmd, tfile) 223*760c253cSXin Li- out, err = runcmd(cmd...) 224*760c253cSXin Li+ out, err = goRun(runcmd, nil, tfile) 225*760c253cSXin Li if err != nil { 226*760c253cSXin Li t.err = err 227*760c253cSXin Li return 228*760c253cSXin Li@@ -995,12 +963,7 @@ func (t *test) run() { 229*760c253cSXin Li // Run Go file and write its output into temporary Go file. 230*760c253cSXin Li // Compile and errorCheck generated Go file. 231*760c253cSXin Li useTmp = false 232*760c253cSXin Li- cmd := []string{goTool(), "run", goGcflags()} 233*760c253cSXin Li- if *linkshared { 234*760c253cSXin Li- cmd = append(cmd, "-linkshared") 235*760c253cSXin Li- } 236*760c253cSXin Li- cmd = append(cmd, t.goFileName()) 237*760c253cSXin Li- out, err := runcmd(append(cmd, args...)...) 238*760c253cSXin Li+ out, err := goRun(runcmd, nil, t.goFileName(), args...) 239*760c253cSXin Li if err != nil { 240*760c253cSXin Li t.err = err 241*760c253cSXin Li return 242*760c253cSXin Li@@ -1011,7 +974,7 @@ func (t *test) run() { 243*760c253cSXin Li t.err = fmt.Errorf("write tempfile:%s", err) 244*760c253cSXin Li return 245*760c253cSXin Li } 246*760c253cSXin Li- cmdline := []string{goTool(), "tool", "compile", "-e", "-o", "a.o"} 247*760c253cSXin Li+ cmdline := []string{findGoCmd(), "tool", "compile", "-e", "-o", "a.o"} 248*760c253cSXin Li cmdline = append(cmdline, flags...) 249*760c253cSXin Li cmdline = append(cmdline, tfile) 250*760c253cSXin Li out, err = runcmd(cmdline...) 251*760c253cSXin Li@@ -1038,6 +1001,11 @@ func findExecCmd() []string { 252*760c253cSXin Li return execCmd 253*760c253cSXin Li } 254*760c253cSXin Li execCmd = []string{} // avoid work the second time 255*760c253cSXin Li+ if *target != "" { 256*760c253cSXin Li+ execCmd = []string{"go_" + *target + "_exec"} 257*760c253cSXin Li+ return execCmd 258*760c253cSXin Li+ } 259*760c253cSXin Li+ 260*760c253cSXin Li if goos == runtime.GOOS && goarch == runtime.GOARCH { 261*760c253cSXin Li return execCmd 262*760c253cSXin Li } 263*760c253cSXin Li@@ -1048,6 +1016,14 @@ func findExecCmd() []string { 264*760c253cSXin Li return execCmd 265*760c253cSXin Li } 266*760c253cSXin Li 267*760c253cSXin Li+func findGoCmd() string { 268*760c253cSXin Li+ if *target != "" { 269*760c253cSXin Li+ return "go_" + *target 270*760c253cSXin Li+ } 271*760c253cSXin Li+ return "go" 272*760c253cSXin Li+} 273*760c253cSXin Li+ 274*760c253cSXin Li+ 275*760c253cSXin Li func (t *test) String() string { 276*760c253cSXin Li return filepath.Join(t.dir, t.gofile) 277*760c253cSXin Li } 278