summaryrefslogtreecommitdiff
path: root/test/run.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/run.go')
-rw-r--r--test/run.go121
1 files changed, 64 insertions, 57 deletions
diff --git a/test/run.go b/test/run.go
index 3ba35f9d4..ac6e3c0e2 100644
--- a/test/run.go
+++ b/test/run.go
@@ -1,4 +1,4 @@
-// #ignore
+// skip
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -30,7 +30,7 @@ import (
var (
verbose = flag.Bool("v", false, "verbose. if set, parallelism is set to 1.")
- numParallel = flag.Int("n", 8, "number of parallel tests to run")
+ numParallel = flag.Int("n", runtime.NumCPU(), "number of parallel tests to run")
summary = flag.Bool("summary", false, "show summary of results")
showSkips = flag.Bool("show_skips", false, "show skipped tests")
)
@@ -60,13 +60,15 @@ const maxTests = 5000
func main() {
flag.Parse()
+
+ // Disable parallelism if printing
if *verbose {
*numParallel = 1
}
ratec = make(chan bool, *numParallel)
var err error
- letter, err = build.ArchChar(build.DefaultContext.GOARCH)
+ letter, err = build.ArchChar(build.Default.GOARCH)
check(err)
gc = letter + "g"
ld = letter + "l"
@@ -145,7 +147,7 @@ func goFiles(dir string) []string {
check(err)
names := []string{}
for _, name := range dirnames {
- if strings.HasSuffix(name, ".go") {
+ if !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go") {
names = append(names, name)
}
}
@@ -170,7 +172,7 @@ type test struct {
donec chan bool // closed when done
src string
- action string // "compile", "build", "run", "errorcheck"
+ action string // "compile", "build", "run", "errorcheck", "skip"
tempDir string
err error
@@ -208,6 +210,8 @@ func runTests() {
}
}
+var cwd, _ = os.Getwd()
+
func (t *test) goFileName() string {
return filepath.Join(t.dir, t.gofile)
}
@@ -235,7 +239,13 @@ func (t *test) run() {
if strings.HasPrefix(action, "//") {
action = action[2:]
}
- action = strings.TrimSpace(action)
+
+ var args []string
+ f := strings.Fields(action)
+ if len(f) > 0 {
+ action = f[0]
+ args = f[1:]
+ }
switch action {
case "cmpout":
@@ -243,6 +253,9 @@ func (t *test) run() {
fallthrough
case "compile", "build", "run", "errorcheck":
t.action = action
+ case "skip":
+ t.action = "skip"
+ return
default:
t.err = skipError("skipped; unknown pattern: " + action)
t.action = "??"
@@ -255,66 +268,55 @@ func (t *test) run() {
err = ioutil.WriteFile(filepath.Join(t.tempDir, t.gofile), srcBytes, 0644)
check(err)
- cmd := exec.Command("go", "tool", gc, "-e", "-o", "a."+letter, t.gofile)
- var buf bytes.Buffer
- cmd.Stdout = &buf
- cmd.Stderr = &buf
- cmd.Dir = t.tempDir
- err = cmd.Run()
- out := buf.String()
-
- if action == "errorcheck" {
- t.err = t.errorCheck(out)
- return
- }
+ // A few tests (of things like the environment) require these to be set.
+ os.Setenv("GOOS", runtime.GOOS)
+ os.Setenv("GOARCH", runtime.GOARCH)
- if err != nil {
- t.err = fmt.Errorf("build = %v (%q)", err, out)
- return
+ useTmp := true
+ runcmd := func(args ...string) ([]byte, error) {
+ cmd := exec.Command(args[0], args[1:]...)
+ var buf bytes.Buffer
+ cmd.Stdout = &buf
+ cmd.Stderr = &buf
+ if useTmp {
+ cmd.Dir = t.tempDir
+ }
+ err := cmd.Run()
+ return buf.Bytes(), err
}
- if action == "compile" {
+ long := filepath.Join(cwd, t.goFileName())
+ switch action {
+ default:
+ t.err = fmt.Errorf("unimplemented action %q", action)
+
+ case "errorcheck":
+ out, _ := runcmd("go", "tool", gc, "-e", "-o", "a."+letter, long)
+ t.err = t.errorCheck(string(out), long, t.gofile)
return
- }
- if action == "build" || action == "run" {
- buf.Reset()
- cmd = exec.Command("go", "tool", ld, "-o", "a.out", "a."+letter)
- cmd.Stdout = &buf
- cmd.Stderr = &buf
- cmd.Dir = t.tempDir
- err = cmd.Run()
- out = buf.String()
+ case "compile":
+ out, err := runcmd("go", "tool", gc, "-e", "-o", "a."+letter, long)
if err != nil {
- t.err = fmt.Errorf("link = %v (%q)", err, out)
- return
+ t.err = fmt.Errorf("%s\n%s", err, out)
}
- if action == "build" {
- return
- }
- }
- if action == "run" {
- buf.Reset()
- cmd = exec.Command(filepath.Join(t.tempDir, "a.out"))
- cmd.Stdout = &buf
- cmd.Stderr = &buf
- cmd.Dir = t.tempDir
- cmd.Env = append(cmd.Env, "GOARCH="+runtime.GOARCH)
- err = cmd.Run()
- out = buf.String()
+ case "build":
+ out, err := runcmd("go", "build", "-o", "a.exe", long)
if err != nil {
- t.err = fmt.Errorf("run = %v (%q)", err, out)
- return
+ t.err = fmt.Errorf("%s\n%s", err, out)
}
- if out != t.expectedOutput() {
- t.err = fmt.Errorf("output differs; got:\n%s", out)
+ case "run":
+ useTmp = false
+ out, err := runcmd(append([]string{"go", "run", t.goFileName()}, args...)...)
+ if err != nil {
+ t.err = fmt.Errorf("%s\n%s", err, out)
+ }
+ if string(out) != t.expectedOutput() {
+ t.err = fmt.Errorf("incorrect output\n%s", out)
}
- return
}
-
- t.err = fmt.Errorf("unimplemented action %q", action)
}
func (t *test) String() string {
@@ -335,7 +337,7 @@ func (t *test) expectedOutput() string {
return string(b)
}
-func (t *test) errorCheck(outStr string) (err error) {
+func (t *test) errorCheck(outStr string, full, short string) (err error) {
defer func() {
if *verbose && err != nil {
log.Printf("%s gc output:\n%s", t, outStr)
@@ -354,11 +356,16 @@ func (t *test) errorCheck(outStr string) (err error) {
}
}
+ // Cut directory name.
+ for i := range out {
+ out[i] = strings.Replace(out[i], full, short, -1)
+ }
+
for _, we := range t.wantedErrors() {
var errmsgs []string
errmsgs, out = partitionStrings(we.filterRe, out)
if len(errmsgs) == 0 {
- errs = append(errs, fmt.Errorf("errchk: %s:%d: missing expected error: %s", we.file, we.lineNum, we.reStr))
+ errs = append(errs, fmt.Errorf("%s:%d: missing error %q", we.file, we.lineNum, we.reStr))
continue
}
matched := false
@@ -370,7 +377,7 @@ func (t *test) errorCheck(outStr string) (err error) {
}
}
if !matched {
- errs = append(errs, fmt.Errorf("errchk: %s:%d: error(s) on line didn't match pattern: %s", we.file, we.lineNum, we.reStr))
+ errs = append(errs, fmt.Errorf("%s:%d: no match for %q in%s", we.file, we.lineNum, we.reStr, strings.Join(out, "\n")))
continue
}
}
@@ -382,7 +389,7 @@ func (t *test) errorCheck(outStr string) (err error) {
return errs[0]
}
var buf bytes.Buffer
- buf.WriteString("Multiple errors:\n")
+ fmt.Fprintf(&buf, "\n")
for _, err := range errs {
fmt.Fprintf(&buf, "%s\n", err.Error())
}