mirror of
https://github.com/golang/go
synced 2024-11-17 03:34:50 -07:00
testing: only snapshot coverage during fuzzing
Only snapshot/reset coverage counters when we are actually fuzzing. This prevents a race when running corpus/seed values during the testing phase. Fixes #50488 Change-Id: I7dd5a0353a296c0b13eede29ad9af7c78814fa2d Reviewed-on: https://go-review.googlesource.com/c/go/+/376554 Trust: Katie Hockman <katie@golang.org> Reviewed-by: Katie Hockman <katie@golang.org> Trust: Roland Shoemaker <roland@golang.org> Run-TryBot: Roland Shoemaker <roland@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
8b9b365493
commit
1f411e9b6d
38
src/cmd/go/testdata/script/test_fuzz_test_race.txt
vendored
Normal file
38
src/cmd/go/testdata/script/test_fuzz_test_race.txt
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Test that when both race detection and coverage instrumentation are enabled,
|
||||||
|
# and seed values are being executed, the race detector isn't mistakenly
|
||||||
|
# triggered.
|
||||||
|
|
||||||
|
[short] skip
|
||||||
|
[!fuzz] skip
|
||||||
|
|
||||||
|
# Test with coverage instrumentation enbaled (-fuzz) and race instrumentation
|
||||||
|
# but without actually fuzzing the target (by using a non-matching pattern)
|
||||||
|
go test -fuzz=xxx -race -v
|
||||||
|
! stderr 'race detected during execution of test'
|
||||||
|
|
||||||
|
# Test with just race instrumentation enabled
|
||||||
|
go test -race -v
|
||||||
|
! stderr 'race detected during execution of test'
|
||||||
|
|
||||||
|
# Test with coverage and race instrumentation enabled, and a matching fuzz
|
||||||
|
# pattern
|
||||||
|
go test -fuzz=FuzzRace -race -v -fuzztime=200x
|
||||||
|
! stderr 'race detected during execution of test'
|
||||||
|
|
||||||
|
-- go.mod --
|
||||||
|
module test
|
||||||
|
|
||||||
|
-- race_test.go --
|
||||||
|
package race
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func FuzzRace(f *testing.F) {
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
f.Add(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
f.Fuzz(func(t *testing.T, i int) {
|
||||||
|
t.Parallel()
|
||||||
|
})
|
||||||
|
}
|
@ -327,8 +327,10 @@ func (f *F) Fuzz(ff any) {
|
|||||||
// we make sure it is called right before the tRunner function
|
// we make sure it is called right before the tRunner function
|
||||||
// exits, regardless of whether it was executed cleanly, panicked,
|
// exits, regardless of whether it was executed cleanly, panicked,
|
||||||
// or if the fuzzFn called t.Fatal.
|
// or if the fuzzFn called t.Fatal.
|
||||||
defer f.fuzzContext.deps.SnapshotCoverage()
|
if f.testContext.isFuzzing {
|
||||||
f.fuzzContext.deps.ResetCoverage()
|
defer f.fuzzContext.deps.SnapshotCoverage()
|
||||||
|
f.fuzzContext.deps.ResetCoverage()
|
||||||
|
}
|
||||||
fn.Call(args)
|
fn.Call(args)
|
||||||
})
|
})
|
||||||
<-t.signal
|
<-t.signal
|
||||||
|
Loading…
Reference in New Issue
Block a user