| // Copyright 2021 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 fuzz | |
| import ( | |
| "bytes" | |
| "fmt" | |
| "os" | |
| "strconv" | |
| "testing" | |
| ) | |
| func BenchmarkMutatorBytes(b *testing.B) { | |
| origEnv := os.Getenv("GODEBUG") | |
| defer func() { os.Setenv("GODEBUG", origEnv) }() | |
| os.Setenv("GODEBUG", fmt.Sprintf("%s,fuzzseed=123", origEnv)) | |
| m := newMutator() | |
| for _, size := range []int{ | |
| 1, | |
| 10, | |
| 100, | |
| 1000, | |
| 10000, | |
| 100000, | |
| } { | |
| b.Run(strconv.Itoa(size), func(b *testing.B) { | |
| buf := make([]byte, size) | |
| b.ResetTimer() | |
| for i := 0; i < b.N; i++ { | |
| // resize buffer to the correct shape and reset the PCG | |
| buf = buf[0:size] | |
| m.r = newPcgRand() | |
| m.mutate([]any{buf}, workerSharedMemSize) | |
| } | |
| }) | |
| } | |
| } | |
| func BenchmarkMutatorString(b *testing.B) { | |
| origEnv := os.Getenv("GODEBUG") | |
| defer func() { os.Setenv("GODEBUG", origEnv) }() | |
| os.Setenv("GODEBUG", fmt.Sprintf("%s,fuzzseed=123", origEnv)) | |
| m := newMutator() | |
| for _, size := range []int{ | |
| 1, | |
| 10, | |
| 100, | |
| 1000, | |
| 10000, | |
| 100000, | |
| } { | |
| b.Run(strconv.Itoa(size), func(b *testing.B) { | |
| buf := make([]byte, size) | |
| b.ResetTimer() | |
| for i := 0; i < b.N; i++ { | |
| // resize buffer to the correct shape and reset the PCG | |
| buf = buf[0:size] | |
| m.r = newPcgRand() | |
| m.mutate([]any{string(buf)}, workerSharedMemSize) | |
| } | |
| }) | |
| } | |
| } | |
| func BenchmarkMutatorAllBasicTypes(b *testing.B) { | |
| origEnv := os.Getenv("GODEBUG") | |
| defer func() { os.Setenv("GODEBUG", origEnv) }() | |
| os.Setenv("GODEBUG", fmt.Sprintf("%s,fuzzseed=123", origEnv)) | |
| m := newMutator() | |
| types := []any{ | |
| []byte(""), | |
| string(""), | |
| false, | |
| float32(0), | |
| float64(0), | |
| int(0), | |
| int8(0), | |
| int16(0), | |
| int32(0), | |
| int64(0), | |
| uint8(0), | |
| uint16(0), | |
| uint32(0), | |
| uint64(0), | |
| } | |
| for _, t := range types { | |
| b.Run(fmt.Sprintf("%T", t), func(b *testing.B) { | |
| for i := 0; i < b.N; i++ { | |
| m.r = newPcgRand() | |
| m.mutate([]any{t}, workerSharedMemSize) | |
| } | |
| }) | |
| } | |
| } | |
| func TestStringImmutability(t *testing.T) { | |
| v := []any{"hello"} | |
| m := newMutator() | |
| m.mutate(v, 1024) | |
| original := v[0].(string) | |
| originalCopy := make([]byte, len(original)) | |
| copy(originalCopy, []byte(original)) | |
| for i := 0; i < 25; i++ { | |
| m.mutate(v, 1024) | |
| } | |
| if !bytes.Equal([]byte(original), originalCopy) { | |
| t.Fatalf("string was mutated: got %x, want %x", []byte(original), originalCopy) | |
| } | |
| } |