| // 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) |
| } |
| } |