Commit 105c5fa6 authored by Russ Cox's avatar Russ Cox

test: invoke go command in run.go

Lets us run multifile tests and tests with arguments.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5753068
parent 5aee1f3a
// $G $D/$F.go $D/cmplxdivide1.go && $L $D/$F.$A && ./$A.out // run cmplxdivide1.go
// Copyright 2010 The Go Authors. All rights reserved. // Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
......
...@@ -210,6 +210,8 @@ func runTests() { ...@@ -210,6 +210,8 @@ func runTests() {
} }
} }
var cwd, _ = os.Getwd()
func (t *test) goFileName() string { func (t *test) goFileName() string {
return filepath.Join(t.dir, t.gofile) return filepath.Join(t.dir, t.gofile)
} }
...@@ -237,7 +239,13 @@ func (t *test) run() { ...@@ -237,7 +239,13 @@ func (t *test) run() {
if strings.HasPrefix(action, "//") { if strings.HasPrefix(action, "//") {
action = action[2:] 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 { switch action {
case "cmpout": case "cmpout":
...@@ -256,67 +264,53 @@ func (t *test) run() { ...@@ -256,67 +264,53 @@ func (t *test) run() {
err = ioutil.WriteFile(filepath.Join(t.tempDir, t.gofile), srcBytes, 0644) err = ioutil.WriteFile(filepath.Join(t.tempDir, t.gofile), srcBytes, 0644)
check(err) check(err)
cmd := exec.Command("go", "tool", gc, "-e", "-o", "a."+letter, t.gofile) useTmp := true
var buf bytes.Buffer runcmd := func(args ...string) ([]byte, error) {
cmd.Stdout = &buf cmd := exec.Command(args[0], args[1:]...)
cmd.Stderr = &buf var buf bytes.Buffer
cmd.Dir = t.tempDir cmd.Stdout = &buf
err = cmd.Run() cmd.Stderr = &buf
out := buf.String() if useTmp {
cmd.Dir = t.tempDir
if action == "errorcheck" { }
t.err = t.errorCheck(out) cmd.Env = append(cmd.Env, "GOOS="+runtime.GOOS, "GOARCH="+runtime.GOARCH)
return err := cmd.Run()
return buf.Bytes(), err
} }
if err != nil { long := filepath.Join(cwd, t.goFileName())
t.err = fmt.Errorf("build = %v (%q)", err, out) switch action {
return default:
} t.err = fmt.Errorf("unimplemented action %q", action)
if action == "compile" { case "errorcheck":
out, _ := runcmd("go", "tool", gc, "-e", "-o", "a."+letter, long)
t.err = t.errorCheck(string(out), long, t.gofile)
return return
}
case "compile":
if action == "build" || action == "run" { out, err := runcmd("go", "tool", gc, "-e", "-o", "a."+letter, long)
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()
if err != nil { if err != nil {
t.err = fmt.Errorf("link = %v (%q)", err, out) t.err = fmt.Errorf("%s\n%s", err, out)
return
} }
if action == "build" {
return case "build":
out, err := runcmd("go", "build", "-o", "a.exe", long)
if err != nil {
t.err = fmt.Errorf("%s\n%s", err, out)
} }
}
case "run":
if action == "run" { useTmp = false
buf.Reset() out, err := runcmd(append([]string{"go", "run", t.goFileName()}, args...)...)
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()
if err != nil { if err != nil {
t.err = fmt.Errorf("run = %v (%q)", err, out) t.err = fmt.Errorf("%s\n%s", err, out)
return
} }
if string(out) != t.expectedOutput() {
if out != t.expectedOutput() { t.err = fmt.Errorf("incorrect output\n%s", out)
t.err = fmt.Errorf("output differs; got:\n%s", out)
} }
return
} }
t.err = fmt.Errorf("unimplemented action %q", action)
} }
func (t *test) String() string { func (t *test) String() string {
...@@ -337,7 +331,7 @@ func (t *test) expectedOutput() string { ...@@ -337,7 +331,7 @@ func (t *test) expectedOutput() string {
return string(b) return string(b)
} }
func (t *test) errorCheck(outStr string) (err error) { func (t *test) errorCheck(outStr string, full, short string) (err error) {
defer func() { defer func() {
if *verbose && err != nil { if *verbose && err != nil {
log.Printf("%s gc output:\n%s", t, outStr) log.Printf("%s gc output:\n%s", t, outStr)
...@@ -356,11 +350,16 @@ func (t *test) errorCheck(outStr string) (err error) { ...@@ -356,11 +350,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() { for _, we := range t.wantedErrors() {
var errmsgs []string var errmsgs []string
errmsgs, out = partitionStrings(we.filterRe, out) errmsgs, out = partitionStrings(we.filterRe, out)
if len(errmsgs) == 0 { 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 continue
} }
matched := false matched := false
...@@ -372,7 +371,7 @@ func (t *test) errorCheck(outStr string) (err error) { ...@@ -372,7 +371,7 @@ func (t *test) errorCheck(outStr string) (err error) {
} }
} }
if !matched { 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 continue
} }
} }
...@@ -384,7 +383,7 @@ func (t *test) errorCheck(outStr string) (err error) { ...@@ -384,7 +383,7 @@ func (t *test) errorCheck(outStr string) (err error) {
return errs[0] return errs[0]
} }
var buf bytes.Buffer var buf bytes.Buffer
buf.WriteString("Multiple errors:\n") fmt.Fprintf(&buf, "\n")
for _, err := range errs { for _, err := range errs {
fmt.Fprintf(&buf, "%s\n", err.Error()) fmt.Fprintf(&buf, "%s\n", err.Error())
} }
......
...@@ -14,7 +14,21 @@ build() { ...@@ -14,7 +14,21 @@ build() {
} }
run() { run() {
$G $D/$F.go && $L $F.$A && ./$A.out "$@" gofiles=""
ingo=true
while $ingo; do
case "$1" in
*.go)
gofiles="$gofiles $1"
shift
;;
*)
ingo=false
;;
esac
done
$G $D/$F.go "$gofiles" && $L $F.$A && ./$A.out "$@"
} }
cmpout() { cmpout() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment