[short] skip

env GO111MODULE=on
env GOCACHE=$WORK/gocache
env GODEBUG=gocachetest=1

# The first run of a test should not be cached.
# The second run should be.
go test -run=WriteTmp .
! stdout '(cached)'
go test -run=WriteTmp .
stdout '(cached)'

# 'go test' without arguments should never be cached.
go test -run=WriteTmp
! stdout '(cached)'
go test -run=WriteTmp
! stdout '(cached)'

# We should never cache a test run from command-line files.
go test -run=WriteTmp ./foo_test.go
! stdout '(cached)'
go test -run=WriteTmp ./foo_test.go
! stdout '(cached)'

[!exec:sleep] stop
# The go command refuses to cache access to files younger than 2s, so sleep that long.
exec sleep 2

# Touching a file that the test reads from within its testdata should invalidate the cache.
go test -run=ReadTestdata .
! stdout '(cached)'
go test -run=ReadTestdata .
stdout '(cached)'
cp testdata/bar.txt testdata/foo.txt
go test -run=ReadTestdata .
! stdout '(cached)'

-- go.mod --
module golang.org/issue/29111/foo

-- foo.go --
package foo

-- testdata/foo.txt --
foo
-- testdata/bar.txt --
bar

-- foo_test.go --
package foo_test

import (
	"os"
	"path/filepath"
	"testing"
)

func TestWriteTmp(t *testing.T) {
	dir, err := os.MkdirTemp("", "")
	if err != nil {
		t.Fatal(err)
	}
	defer os.RemoveAll(dir)
	err = os.WriteFile(filepath.Join(dir, "x"), nil, 0666)
	if err != nil {
		t.Fatal(err)
	}
}

func TestReadTestdata(t *testing.T) {
	_, err := os.ReadFile("testdata/foo.txt")
	if err != nil {
		t.Fatal(err)
	}
}
