cmd/go: add a 'sleep' command for script tests

Due to mtime skew we don't index mutable packages with an mtime
younger than 2 seconds. In order to test indexed packages reliably, we
want to be able to sleep long enough for the files in the package to be cached.

(As an alternative we could instead use os.Chtimes to fake old enough
timestamps, but sleeping keeps the tests more realistic.)

For #53586.

Change-Id: I1873f47c55a72d928451593b8c989f0092a557db
Reviewed-on: https://go-review.googlesource.com/c/go/+/415474
Auto-Submit: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
Reviewed-by: Russ Cox <rsc@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
Bryan C. Mills 2022-06-30 13:30:48 -04:00 committed by Gopher Robot
parent 31b8c23c57
commit 84db00ffd1
2 changed files with 21 additions and 0 deletions

View File

@ -521,6 +521,7 @@ var scriptCmds = map[string]func(*testScript, simpleStatus, []string){
"mv": (*testScript).cmdMv, "mv": (*testScript).cmdMv,
"rm": (*testScript).cmdRm, "rm": (*testScript).cmdRm,
"skip": (*testScript).cmdSkip, "skip": (*testScript).cmdSkip,
"sleep": (*testScript).cmdSleep,
"stale": (*testScript).cmdStale, "stale": (*testScript).cmdStale,
"stderr": (*testScript).cmdStderr, "stderr": (*testScript).cmdStderr,
"stdout": (*testScript).cmdStdout, "stdout": (*testScript).cmdStdout,
@ -921,6 +922,21 @@ func (ts *testScript) cmdSkip(want simpleStatus, args []string) {
ts.t.Skip() ts.t.Skip()
} }
// sleep sleeps for the given duration
func (ts *testScript) cmdSleep(want simpleStatus, args []string) {
if len(args) != 1 {
ts.fatalf("usage: sleep duration")
}
d, err := time.ParseDuration(args[0])
if err != nil {
ts.fatalf("sleep: %v", err)
}
if want != success {
ts.fatalf("unsupported: %v sleep", want)
}
time.Sleep(d)
}
// stale checks that the named build targets are stale. // stale checks that the named build targets are stale.
func (ts *testScript) cmdStale(want simpleStatus, args []string) { func (ts *testScript) cmdStale(want simpleStatus, args []string) {
if len(args) == 0 { if len(args) == 0 {

View File

@ -176,6 +176,11 @@ The commands are:
- skip [message] - skip [message]
Mark the test skipped, including the message if given. Mark the test skipped, including the message if given.
- sleep duration
Sleep for the given duration (a time.Duration string).
(Tests should generally poll instead of sleeping, but sleeping may sometimes
be necessary, for example, to ensure that modified files have unique mtimes.)
- [!] stale path... - [!] stale path...
The packages named by the path arguments must (or must not) The packages named by the path arguments must (or must not)
be reported as "stale" by the go command. be reported as "stale" by the go command.