Commit afac2c05 authored by Bryan C. Mills's avatar Bryan C. Mills

test: avoid writing temporary files to GOROOT

This reverts CL 207477, restoring CL 207352 with a fix for the
regression observed in the Windows builders.

cmd/compile evidently does not fully support NUL as an output on
Windows, so this time we write ignored 'compile' outputs
to temporary files (instead of os.DevNull as in CL 207352).

Updates #28387
Fixes #35619

Change-Id: I2edc5727c3738fa1bccb4b74e50d114cf2a7fcff
Reviewed-on: https://go-review.googlesource.com/c/go/+/207602
Run-TryBot: Bryan C. Mills <bcmills@google.com>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 2bde3c13
...@@ -1358,17 +1358,21 @@ var runtest struct { ...@@ -1358,17 +1358,21 @@ var runtest struct {
func (t *tester) testDirTest(dt *distTest, shard, shards int) error { func (t *tester) testDirTest(dt *distTest, shard, shards int) error {
runtest.Do(func() { runtest.Do(func() {
const exe = "runtest.exe" // named exe for Windows, but harmless elsewhere f, err := ioutil.TempFile("", "runtest-*.exe") // named exe for Windows, but harmless elsewhere
cmd := t.dirCmd("test", "go", "build", "-o", exe, "run.go") if err != nil {
cmd.Env = append(os.Environ(), "GOOS="+gohostos, "GOARCH="+gohostarch)
runtest.exe = filepath.Join(cmd.Dir, exe)
if err := cmd.Run(); err != nil {
runtest.err = err runtest.err = err
return return
} }
f.Close()
runtest.exe = f.Name()
xatexit(func() { xatexit(func() {
os.Remove(runtest.exe) os.Remove(runtest.exe)
}) })
cmd := t.dirCmd("test", "go", "build", "-o", runtest.exe, "run.go")
cmd.Env = append(os.Environ(), "GOOS="+gohostos, "GOARCH="+gohostarch)
runtest.err = cmd.Run()
}) })
if runtest.err != nil { if runtest.err != nil {
return runtest.err return runtest.err
......
...@@ -9,22 +9,34 @@ package main ...@@ -9,22 +9,34 @@ package main
import ( import (
"fmt" "fmt"
"io/ioutil"
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
) )
var tmpDir string
func main() { func main() {
run("go", "tool", "compile", filepath.Join("fixedbugs", "bug302.dir", "p.go")) fb, err := filepath.Abs("fixedbugs")
if err == nil {
tmpDir, err = ioutil.TempDir("", "bug302")
}
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer os.RemoveAll(tmpDir)
run("go", "tool", "compile", filepath.Join(fb, "bug302.dir", "p.go"))
run("go", "tool", "pack", "grc", "pp.a", "p.o") run("go", "tool", "pack", "grc", "pp.a", "p.o")
run("go", "tool", "compile", "-I", ".", filepath.Join("fixedbugs", "bug302.dir", "main.go")) run("go", "tool", "compile", "-I", ".", filepath.Join(fb, "bug302.dir", "main.go"))
os.Remove("p.o")
os.Remove("pp.a")
os.Remove("main.o")
} }
func run(cmd string, args ...string) { func run(cmd string, args ...string) {
out, err := exec.Command(cmd, args...).CombinedOutput() c := exec.Command(cmd, args...)
c.Dir = tmpDir
out, err := c.CombinedOutput()
if err != nil { if err != nil {
fmt.Println(string(out)) fmt.Println(string(out))
fmt.Println(err) fmt.Println(err)
......
...@@ -11,6 +11,7 @@ package main ...@@ -11,6 +11,7 @@ package main
import ( import (
"fmt" "fmt"
"io/ioutil"
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
...@@ -20,16 +21,19 @@ func main() { ...@@ -20,16 +21,19 @@ func main() {
err := os.Chdir(filepath.Join(".", "fixedbugs", "bug369.dir")) err := os.Chdir(filepath.Join(".", "fixedbugs", "bug369.dir"))
check(err) check(err)
run("go", "tool", "compile", "-N", "-o", "slow.o", "pkg.go") tmpDir, err := ioutil.TempDir("", "bug369")
run("go", "tool", "compile", "-o", "fast.o", "pkg.go") check(err)
run("go", "tool", "compile", "-o", "main.o", "main.go") defer os.RemoveAll(tmpDir)
run("go", "tool", "link", "-o", "a.exe", "main.o")
run("." + string(filepath.Separator) + "a.exe") tmp := func(name string) string {
return filepath.Join(tmpDir, name)
}
os.Remove("slow.o") run("go", "tool", "compile", "-N", "-o", tmp("slow.o"), "pkg.go")
os.Remove("fast.o") run("go", "tool", "compile", "-o", tmp("fast.o"), "pkg.go")
os.Remove("main.o") run("go", "tool", "compile", "-D", tmpDir, "-o", tmp("main.o"), "main.go")
os.Remove("a.exe") run("go", "tool", "link", "-o", tmp("a.exe"), tmp("main.o"))
run(tmp("a.exe"))
} }
func run(name string, args ...string) { func run(name string, args ...string) {
......
...@@ -8,6 +8,7 @@ package main ...@@ -8,6 +8,7 @@ package main
import ( import (
"fmt" "fmt"
"io/ioutil"
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
...@@ -23,8 +24,15 @@ func main() { ...@@ -23,8 +24,15 @@ func main() {
err := os.Chdir(filepath.Join("fixedbugs", "issue9355.dir")) err := os.Chdir(filepath.Join("fixedbugs", "issue9355.dir"))
check(err) check(err)
out := run("go", "tool", "compile", "-S", "a.go") f, err := ioutil.TempFile("", "issue9355-*.o")
os.Remove("a.o") if err != nil {
fmt.Println(err)
os.Exit(1)
}
f.Close()
out := run("go", "tool", "compile", "-o", f.Name(), "-S", "a.go")
os.Remove(f.Name())
// 6g/8g print the offset as dec, but 5g/9g print the offset as hex. // 6g/8g print the offset as dec, but 5g/9g print the offset as hex.
patterns := []string{ patterns := []string{
......
...@@ -11,21 +11,21 @@ package main ...@@ -11,21 +11,21 @@ package main
import ( import (
"fmt" "fmt"
"io/ioutil"
"os" "os"
"os/exec" "os/exec"
"path/filepath"
"strings" "strings"
) )
var tmpDir string
func cleanup() { func cleanup() {
os.Remove("linkmain.o") os.RemoveAll(tmpDir)
os.Remove("linkmain.a")
os.Remove("linkmain1.o")
os.Remove("linkmain1.a")
os.Remove("linkmain.exe")
} }
func run(cmdline string) { func run(cmdline ...string) {
args := strings.Fields(cmdline) args := strings.Fields(strings.Join(cmdline, " "))
cmd := exec.Command(args[0], args[1:]...) cmd := exec.Command(args[0], args[1:]...)
out, err := cmd.CombinedOutput() out, err := cmd.CombinedOutput()
if err != nil { if err != nil {
...@@ -37,8 +37,8 @@ func run(cmdline string) { ...@@ -37,8 +37,8 @@ func run(cmdline string) {
} }
} }
func runFail(cmdline string) { func runFail(cmdline ...string) {
args := strings.Fields(cmdline) args := strings.Fields(strings.Join(cmdline, " "))
cmd := exec.Command(args[0], args[1:]...) cmd := exec.Command(args[0], args[1:]...)
out, err := cmd.CombinedOutput() out, err := cmd.CombinedOutput()
if err == nil { if err == nil {
...@@ -51,16 +51,26 @@ func runFail(cmdline string) { ...@@ -51,16 +51,26 @@ func runFail(cmdline string) {
} }
func main() { func main() {
var err error
tmpDir, err = ioutil.TempDir("", "")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
tmp := func(name string) string {
return filepath.Join(tmpDir, name)
}
// helloworld.go is package main // helloworld.go is package main
run("go tool compile -o linkmain.o helloworld.go") run("go tool compile -o", tmp("linkmain.o"), "helloworld.go")
run("go tool compile -pack -o linkmain.a helloworld.go") run("go tool compile -pack -o", tmp("linkmain.a"), "helloworld.go")
run("go tool link -o linkmain.exe linkmain.o") run("go tool link -o", tmp("linkmain.exe"), tmp("linkmain.o"))
run("go tool link -o linkmain.exe linkmain.a") run("go tool link -o", tmp("linkmain.exe"), tmp("linkmain.a"))
// linkmain.go is not // linkmain.go is not
run("go tool compile -o linkmain1.o linkmain.go") run("go tool compile -o", tmp("linkmain1.o"), "linkmain.go")
run("go tool compile -pack -o linkmain1.a linkmain.go") run("go tool compile -pack -o", tmp("linkmain1.a"), "linkmain.go")
runFail("go tool link -o linkmain.exe linkmain1.o") runFail("go tool link -o", tmp("linkmain.exe"), tmp("linkmain1.o"))
runFail("go tool link -o linkmain.exe linkmain1.a") runFail("go tool link -o", tmp("linkmain.exe"), tmp("linkmain1.a"))
cleanup() cleanup()
} }
...@@ -12,20 +12,32 @@ package main ...@@ -12,20 +12,32 @@ package main
import ( import (
"bytes" "bytes"
"fmt" "fmt"
"io/ioutil"
"os" "os"
"os/exec" "os/exec"
) )
func main() { func main() {
cmd := exec.Command("go", "tool", "compile", "-S", "sinit.go") f, err := ioutil.TempFile("", "sinit-*.o")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
f.Close()
cmd := exec.Command("go", "tool", "compile", "-o", f.Name(), "-S", "sinit.go")
out, err := cmd.CombinedOutput() out, err := cmd.CombinedOutput()
os.Remove(f.Name())
if err != nil { if err != nil {
fmt.Println(string(out)) fmt.Println(string(out))
fmt.Println(err) fmt.Println(err)
os.Exit(1) os.Exit(1)
} }
os.Remove("sinit.o")
if len(bytes.TrimSpace(out)) == 0 {
fmt.Println("'go tool compile -S sinit.go' printed no output")
os.Exit(1)
}
if bytes.Contains(out, []byte("initdone")) { if bytes.Contains(out, []byte("initdone")) {
fmt.Println("sinit generated an init function") fmt.Println("sinit generated an init function")
os.Exit(1) os.Exit(1)
......
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