mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/go: invalidate cached test results if env vars or files change
When we write a cached test result, we now also write a log of the environment variables and files inspected by the test run, along with a hash of their content. Before reusing a cached test result, we recompute the hash of the content specified by the log, and only use the result if that content has not changed. This makes test caching behave correctly for tests that consult environment variables or stat or read files or directories. Fixes #22593. Change-Id: I8608798e73c90e0c1911a38bf7e03e1232d784dc Reviewed-on: https://go-review.googlesource.com/81895 Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
8c227765f7
commit
29be20a111
18 changed files with 652 additions and 47 deletions
|
|
@ -268,10 +268,12 @@ var (
|
|||
timeout = flag.Duration("test.timeout", 0, "panic test binary after duration `d` (default 0, timeout disabled)")
|
||||
cpuListStr = flag.String("test.cpu", "", "comma-separated `list` of cpu counts to run each test with")
|
||||
parallel = flag.Int("test.parallel", runtime.GOMAXPROCS(0), "run at most `n` tests in parallel")
|
||||
testlog = flag.String("test.testlogfile", "", "write test action log to `file` (for use only by cmd/go)")
|
||||
|
||||
haveExamples bool // are there examples?
|
||||
|
||||
cpuList []int
|
||||
cpuList []int
|
||||
testlogFile *os.File
|
||||
|
||||
numFailed uint32 // number of test failures
|
||||
)
|
||||
|
|
@ -889,6 +891,8 @@ func (f matchStringOnly) StopCPUProfile() {}
|
|||
func (f matchStringOnly) WriteHeapProfile(w io.Writer) error { return errMain }
|
||||
func (f matchStringOnly) WriteProfileTo(string, io.Writer, int) error { return errMain }
|
||||
func (f matchStringOnly) ImportPath() string { return "" }
|
||||
func (f matchStringOnly) StartTestLog(io.Writer) {}
|
||||
func (f matchStringOnly) StopTestLog() error { return errMain }
|
||||
|
||||
// Main is an internal function, part of the implementation of the "go test" command.
|
||||
// It was exported because it is cross-package and predates "internal" packages.
|
||||
|
|
@ -916,12 +920,14 @@ type M struct {
|
|||
// The canonical implementation of this interface is
|
||||
// testing/internal/testdeps's TestDeps.
|
||||
type testDeps interface {
|
||||
ImportPath() string
|
||||
MatchString(pat, str string) (bool, error)
|
||||
StartCPUProfile(io.Writer) error
|
||||
StopCPUProfile()
|
||||
StartTestLog(io.Writer)
|
||||
StopTestLog() error
|
||||
WriteHeapProfile(io.Writer) error
|
||||
WriteProfileTo(string, io.Writer, int) error
|
||||
ImportPath() string
|
||||
}
|
||||
|
||||
// MainStart is meant for use by tests generated by 'go test'.
|
||||
|
|
@ -1100,6 +1106,17 @@ func (m *M) before() {
|
|||
fmt.Fprintf(os.Stderr, "testing: cannot use -test.coverprofile because test binary was not built with coverage enabled\n")
|
||||
os.Exit(2)
|
||||
}
|
||||
if *testlog != "" {
|
||||
// Note: Not using toOutputDir.
|
||||
// This file is for use by cmd/go, not users.
|
||||
f, err := os.Create(*testlog)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "testing: %s\n", err)
|
||||
os.Exit(2)
|
||||
}
|
||||
m.deps.StartTestLog(f)
|
||||
testlogFile = f
|
||||
}
|
||||
}
|
||||
|
||||
// after runs after all testing.
|
||||
|
|
@ -1110,6 +1127,16 @@ func (m *M) after() {
|
|||
}
|
||||
|
||||
func (m *M) writeProfiles() {
|
||||
if *testlog != "" {
|
||||
if err := m.deps.StopTestLog(); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *testlog, err)
|
||||
os.Exit(2)
|
||||
}
|
||||
if err := testlogFile.Close(); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *testlog, err)
|
||||
os.Exit(2)
|
||||
}
|
||||
}
|
||||
if *cpuProfile != "" {
|
||||
m.deps.StopCPUProfile() // flushes profile to disk
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue