if testO != "" && len(pkgs) != 1 {
base.Fatalf("cannot use -o flag with multiple packages")
}
+ if testFuzz != "" && len(pkgs) != 1 {
+ base.Fatalf("cannot use -fuzz flag with multiple packages")
+ }
if testProfile() != "" && len(pkgs) != 1 {
base.Fatalf("cannot use %s flag with multiple packages", testProfile())
}
stdout '^ok.*no tests to run'
! stdout 'no targets to fuzz'
-# Matches more than one fuzz target for fuzzing.
-! go test -fuzz Fuzz -fuzztime 1x multiple_fuzz_test.go
-! stdout 'no tests to run'
-! stdout 'no targets to fuzz'
-stdout FAIL
-stdout 'will not fuzz, -fuzz matches more than one target'
-
-- standalone_fuzz_test.go --
package standalone_fuzz
func Fuzz(f *testing.F) {
f.Fuzz(func (*testing.T, []byte) {})
}
-
--- multiple_fuzz_test.go --
-package multiple_fuzz
-
-import "testing"
-
-func FuzzA(f *testing.F) {
- f.Fuzz(func (*testing.T, []byte) {})
-}
-
-func FuzzB(f *testing.F) {
- f.Fuzz(func (*testing.T, []byte) {})
-}
--- /dev/null
+# This test checks that 'go test' prints a reasonable error when fuzzing is
+# enabled, and multiple package or multiple fuzz targets match.
+# TODO(#46312): support fuzzing multiple targets in multiple packages.
+
+# TODO(jayconrod): support shared memory on more platforms.
+[!darwin] [!linux] [!windows] skip
+
+[short] skip
+
+# With fuzzing disabled, multiple targets can be tested.
+go test ./...
+
+# With fuzzing enabled, at most one package may be tested,
+# even if only one package contains fuzz targets.
+! go test -fuzz=. ./...
+stderr '^cannot use -fuzz flag with multiple packages$'
+! go test -fuzz=. ./zero ./one
+stderr '^cannot use -fuzz flag with multiple packages$'
+go test -fuzz=. -fuzztime=1x ./one
+
+# With fuzzing enabled, at most one target in the same package may match.
+! go test -fuzz=. ./two
+stdout '^testing: will not fuzz, -fuzz matches more than one target: \[FuzzOne FuzzTwo\]$'
+go test -fuzz=FuzzTwo -fuzztime=1x ./two
+
+-- go.mod --
+module fuzz
+
+go 1.18
+-- zero/zero.go --
+package zero
+-- one/one_test.go --
+package one
+
+import "testing"
+
+func FuzzOne(f *testing.F) {
+ f.Fuzz(func(*testing.T, []byte) {})
+}
+-- two/two_test.go --
+package two
+
+import "testing"
+
+func FuzzOne(f *testing.F) {
+ f.Fuzz(func(*testing.T, []byte) {})
+}
+
+func FuzzTwo(f *testing.F) {
+ f.Fuzz(func(*testing.T, []byte) {})
+}