]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/fuzztest: move fuzz tests out of cmd/go test suite
authorMichael Matloob <matloob@golang.org>
Thu, 4 Dec 2025 19:21:44 +0000 (14:21 -0500)
committerGopher Robot <gobot@golang.org>
Thu, 4 Dec 2025 23:05:53 +0000 (15:05 -0800)
They are very slow: taking them out of the cmd/go test suite makes the
go command tests go from about 80 seconds to run on my system, to about
50 seconds to run.

Change-Id: I19b5c252bd2b6e6d64821cada961ddaa6a6a6964
Reviewed-on: https://go-review.googlesource.com/c/go/+/726960
Auto-Submit: Michael Matloob <matloob@google.com>
Reviewed-by: Alan Donovan <adonovan@google.com>
Reviewed-by: Michael Matloob <matloob@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

35 files changed:
src/cmd/go/internal/test/test.go
src/cmd/internal/fuzztest/script_test.go [new file with mode: 0644]
src/cmd/internal/fuzztest/testdata/script/README [new file with mode: 0644]
src/cmd/internal/fuzztest/testdata/script/test_fuzz.txt [moved from src/cmd/go/testdata/script/test_fuzz.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_cache.txt [moved from src/cmd/go/testdata/script/test_fuzz_cache.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_cgo.txt [moved from src/cmd/go/testdata/script/test_fuzz_cgo.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_chatty.txt [moved from src/cmd/go/testdata/script/test_fuzz_chatty.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_cleanup.txt [moved from src/cmd/go/testdata/script/test_fuzz_cleanup.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_context.txt [moved from src/cmd/go/testdata/script/test_fuzz_context.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_cov.txt [moved from src/cmd/go/testdata/script/test_fuzz_cov.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_deadline.txt [moved from src/cmd/go/testdata/script/test_fuzz_deadline.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_dup_cache.txt [moved from src/cmd/go/testdata/script/test_fuzz_dup_cache.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_err_deadlock.txt [moved from src/cmd/go/testdata/script/test_fuzz_err_deadlock.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_fuzztime.txt [moved from src/cmd/go/testdata/script/test_fuzz_fuzztime.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_io_error.txt [moved from src/cmd/go/testdata/script/test_fuzz_io_error.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_limit_dup_entry.txt [moved from src/cmd/go/testdata/script/test_fuzz_limit_dup_entry.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_match.txt [moved from src/cmd/go/testdata/script/test_fuzz_match.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_minimize.txt [moved from src/cmd/go/testdata/script/test_fuzz_minimize.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_minimize_dirty_cov.txt [moved from src/cmd/go/testdata/script/test_fuzz_minimize_dirty_cov.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_minimize_interesting.txt [moved from src/cmd/go/testdata/script/test_fuzz_minimize_interesting.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_multiple.txt [moved from src/cmd/go/testdata/script/test_fuzz_multiple.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_mutate_crash.txt [moved from src/cmd/go/testdata/script/test_fuzz_mutate_crash.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_mutate_fail.txt [moved from src/cmd/go/testdata/script/test_fuzz_mutate_fail.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_mutator.txt [moved from src/cmd/go/testdata/script/test_fuzz_mutator.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_mutator_repeat.txt [moved from src/cmd/go/testdata/script/test_fuzz_mutator_repeat.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_non_crash_signal.txt [moved from src/cmd/go/testdata/script/test_fuzz_non_crash_signal.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_parallel.txt [moved from src/cmd/go/testdata/script/test_fuzz_parallel.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_profile_flags.txt [moved from src/cmd/go/testdata/script/test_fuzz_profile_flags.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_return.txt [moved from src/cmd/go/testdata/script/test_fuzz_return.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_run.txt [moved from src/cmd/go/testdata/script/test_fuzz_run.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_seed_corpus.txt [moved from src/cmd/go/testdata/script/test_fuzz_seed_corpus.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_setenv.txt [moved from src/cmd/go/testdata/script/test_fuzz_setenv.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_test_race.txt [moved from src/cmd/go/testdata/script/test_fuzz_test_race.txt with 100% similarity]
src/cmd/internal/fuzztest/testdata/script/test_fuzz_unsupported.txt [moved from src/cmd/go/testdata/script/test_fuzz_unsupported.txt with 100% similarity]
src/cmd/internal/script/scripttest/run.go

index b30b2abc0e9ef7a4e67e47c3e5da96c192089d0a..ddc9c81baf6c068907b2dc2bcf4cb687477dffad 100644 (file)
@@ -736,7 +736,7 @@ func runTest(ctx context.Context, cmd *base.Command, args []string) {
                // Otherwise, if fuzzing identifies a failure it could corrupt checksums in
                // the module cache (or permanently alter the behavior of std tests for all
                // users) by writing the failing input to the package's testdata directory.
-               // (See https://golang.org/issue/48495 and test_fuzz_modcache.txt.)
+               // (See https://golang.org/issue/48495 and cmd/internal/fuzztest/test_fuzz_modcache.txt.)
                mainMods := moduleLoaderState.MainModules
                if m := pkgs[0].Module; m != nil && m.Path != "" {
                        if !mainMods.Contains(m.Path) {
diff --git a/src/cmd/internal/fuzztest/script_test.go b/src/cmd/internal/fuzztest/script_test.go
new file mode 100644 (file)
index 0000000..e8fe701
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2025 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package fuzztest
+
+import (
+       "cmd/internal/script/scripttest"
+       "flag"
+       "internal/testenv"
+       "testing"
+)
+
+//go:generate go test cmd/internal/fuzztest -v -run=TestScript/README --fixreadme
+
+var fixReadme = flag.Bool("fixreadme", false, "if true, update README for script tests")
+
+func TestScript(t *testing.T) {
+       testenv.MustHaveGoBuild(t)
+       testenv.SkipIfShortAndSlow(t)
+       scripttest.RunToolScriptTest(t, nil, "testdata/script", *fixReadme)
+}
diff --git a/src/cmd/internal/fuzztest/testdata/script/README b/src/cmd/internal/fuzztest/testdata/script/README
new file mode 100644 (file)
index 0000000..9ec997a
--- /dev/null
@@ -0,0 +1,286 @@
+This file is generated by 'go generate'. DO NOT EDIT.
+
+This directory holds test scripts *.txt run during 'go test cmd/<toolname>'.
+To run a specific script foo.txt
+
+       go test cmd/<toolname> -run=Script/^foo$
+
+In general script files should have short names: a few words,
+ not whole sentences.
+The first word should be the general category of behavior being tested,
+often the name of a go subcommand (build, link, compile, ...) or concept (vendor, pattern).
+
+Each script is a text archive (go doc internal/txtar).
+The script begins with an actual command script to run
+followed by the content of zero or more supporting files to
+create in the script's temporary file system before it starts executing.
+
+As an example, run_hello.txt says:
+
+       # hello world
+       go run hello.go
+       stderr 'hello world'
+       ! stdout .
+
+       -- hello.go --
+       package main
+       func main() { println("hello world") }
+
+Each script runs in a fresh temporary work directory tree, available to scripts as $WORK.
+Scripts also have access to other environment variables, including:
+
+       GOARCH=<target GOARCH>
+       GOOS=<target GOOS>
+       TMPDIR=$WORK/tmp
+       devnull=<value of os.DevNull>
+       goversion=<current Go version; for example, 1.12>
+
+On Plan 9, the variables $path and $home are set instead of $PATH and $HOME.
+On Windows, the variables $USERPROFILE and $TMP are set instead of
+$HOME and $TMPDIR.
+
+The lines at the top of the script are a sequence of commands to be executed by
+a small script engine configured in .../cmd/internal/script/scripttest/run.go (not the system shell).
+
+Each line of a script is parsed into a sequence of space-separated command
+words, with environment variable expansion within each word and # marking
+an end-of-line comment. Additional variables named ':' and '/' are expanded
+within script arguments (expanding to the value of os.PathListSeparator and
+os.PathSeparator respectively) but are not inherited in subprocess environments.
+
+Adding single quotes around text keeps spaces in that text from being treated
+as word separators and also disables environment variable expansion. Inside a
+single-quoted block of text, a repeated single quote indicates a literal single
+quote, as in:
+
+    'Don''t communicate by sharing memory.'
+
+A line beginning with # is a comment and conventionally explains what is being
+done or tested at the start of a new section of the script.
+
+Commands are executed one at a time, and errors are checked for each command;
+if any command fails unexpectedly, no subsequent commands in the script are
+executed. The command prefix ! indicates that the command on the rest of the
+line (typically go or a matching predicate) must fail instead of succeeding.
+The command prefix ? indicates that the command may or may not succeed, but the
+script should continue regardless.
+
+The command prefix [cond] indicates that the command on the rest of the line
+should only run when the condition is satisfied.
+
+A condition can be negated: [!root] means to run the rest of the line only if
+the user is not root. Multiple conditions may be given for a single command,
+for example, '[linux] [amd64] skip'. The command will run if all conditions are
+satisfied.
+
+When TestScript runs a script and the script fails, by default TestScript shows
+the execution of the most recent phase of the script (since the last # comment)
+and only shows the # comments for earlier phases.
+
+Note also that in reported output, the actual name of the per-script temporary directory
+has been consistently replaced with the literal string $WORK.
+
+The available commands are:
+cat files...
+       concatenate files and print to the script's stdout buffer
+
+
+cc args...
+       run the platform C compiler
+
+
+cd dir
+       change the working directory
+
+
+chmod perm paths...
+       change file mode bits
+
+       Changes the permissions of the named files or directories to
+       be equal to perm.
+       Only numerical permissions are supported.
+
+cmp [-q] file1 file2
+       compare files for differences
+
+       By convention, file1 is the actual data and file2 is the
+       expected data.
+       The command succeeds if the file contents are identical.
+       File1 can be 'stdout' or 'stderr' to compare the stdout or
+       stderr buffer from the most recent command.
+
+cmpenv [-q] file1 file2
+       compare files for differences, with environment expansion
+
+       By convention, file1 is the actual data and file2 is the
+       expected data.
+       The command succeeds if the file contents are identical
+       after substituting variables from the script environment.
+       File1 can be 'stdout' or 'stderr' to compare the script's
+       stdout or stderr buffer.
+
+cp src... dst
+       copy files to a target file or directory
+
+       src can include 'stdout' or 'stderr' to copy from the
+       script's stdout or stderr buffer.
+
+echo string...
+       display a line of text
+
+
+env [key[=value]...]
+       set or log the values of environment variables
+
+       With no arguments, print the script environment to the log.
+       Otherwise, add the listed key=value pairs to the environment
+       or print the listed keys.
+
+exec program [args...] [&]
+       run an executable program with arguments
+
+       Note that 'exec' does not terminate the script (unlike Unix
+       shells).
+
+exists [-readonly] [-exec] file...
+       check that files exist
+
+
+go [args...] [&]
+       run the 'go' program provided by the script host
+
+
+grep [-count=N] [-q] 'pattern' file
+       find lines in a file that match a pattern
+
+       The command succeeds if at least one match (or the exact
+       count, if given) is found.
+       The -q flag suppresses printing of matches.
+
+help [-v] name...
+       log help text for commands and conditions
+
+       To display help for a specific condition, enclose it in
+       brackets: 'help [amd64]'.
+       To display complete documentation when listing all commands,
+       pass the -v flag.
+
+mkdir path...
+       create directories, if they do not already exist
+
+       Unlike Unix mkdir, parent directories are always created if
+       needed.
+
+mv old new
+       rename a file or directory to a new path
+
+       OS-specific restrictions may apply when old and new are in
+       different directories.
+
+replace [old new]... file
+       replace strings in a file
+
+       The 'old' and 'new' arguments are unquoted as if in quoted
+       Go strings.
+
+rm path...
+       remove a file or directory
+
+       If the path is a directory, its contents are removed
+       recursively.
+
+skip [msg]
+       skip the current test
+
+
+sleep duration [&]
+       sleep for a specified duration
+
+       The duration must be given as a Go time.Duration string.
+
+stderr [-count=N] [-q] 'pattern' file
+       find lines in the stderr buffer that match a pattern
+
+       The command succeeds if at least one match (or the exact
+       count, if given) is found.
+       The -q flag suppresses printing of matches.
+
+stdout [-count=N] [-q] 'pattern' file
+       find lines in the stdout buffer that match a pattern
+
+       The command succeeds if at least one match (or the exact
+       count, if given) is found.
+       The -q flag suppresses printing of matches.
+
+stop [msg]
+       stop execution of the script
+
+       The message is written to the script log, but no error is
+       reported from the script engine.
+
+symlink path -> target
+       create a symlink
+
+       Creates path as a symlink to target.
+       The '->' token (like in 'ls -l' output on Unix) is required.
+
+wait 
+       wait for completion of background commands
+
+       Waits for all background commands to complete.
+       The output (and any error) from each command is printed to
+       the log in the order in which the commands were started.
+       After the call to 'wait', the script's stdout and stderr
+       buffers contain the concatenation of the background
+       commands' outputs.
+
+
+
+The available conditions are:
+[GOARCH:*]
+       runtime.GOARCH == <suffix>
+[GODEBUG:*]
+       GODEBUG contains <suffix>
+[GOEXPERIMENT:*]
+       GOEXPERIMENT <suffix> is enabled
+[GOOS:*]
+       runtime.GOOS == <suffix>
+[asan]
+       GOOS/GOARCH supports -asan
+[buildmode:*]
+       go supports -buildmode=<suffix>
+[cgo]
+       host CGO_ENABLED
+[cgolinkext]
+       platform requires external linking for cgo
+[compiler:*]
+       runtime.Compiler == <suffix>
+[cross]
+       cmd/go GOOS/GOARCH != GOHOSTOS/GOHOSTARCH
+[exec:*]
+       <suffix> names an executable in the test binary's PATH
+[fuzz]
+       GOOS/GOARCH supports -fuzz
+[fuzz-instrumented]
+       GOOS/GOARCH supports -fuzz with instrumentation
+[go-builder]
+       GO_BUILDER_NAME is non-empty
+[link]
+       testenv.HasLink()
+[msan]
+       GOOS/GOARCH supports -msan
+[mustlinkext]
+       platform always requires external linking
+[pielinkext]
+       platform requires external linking for PIE
+[race]
+       GOOS/GOARCH supports -race
+[root]
+       os.Geteuid() == 0
+[short]
+       testing.Short()
+[symlink]
+       testenv.HasSymlink()
+[verbose]
+       testing.Verbose()
+
index 8dff13e22edfc47be061bd6f401ae63ea0132345..2a909f656d5e896bfba2fe73f0363a28bb0a366f 100644 (file)
@@ -137,6 +137,9 @@ func RunToolScriptTest(t *testing.T, repls []ToolReplacement, scriptsdir string,
        env := os.Environ()
        prependToPath(env, filepath.Join(tgr, "bin"))
        env = setenv(env, "GOROOT", tgr)
+       // GOOS and GOARCH are expected to be set by the toolchain script conditions.
+       env = setenv(env, "GOOS", runtime.GOOS)
+       env = setenv(env, "GOARCH", runtime.GOARCH)
        for _, repl := range repls {
                // consistency check
                chunks := strings.Split(repl.EnvVar, "=")