syzkaller/prog/export_test.go
Dmitry Vyukov 55565fa037 prog: fix minimization bugs
Fix several nasty bugs in minimization that could lead
to almost arbitrary results. These bugs affected both
crash minimization and corpus population.
Extend the randomized test to catch these bugs.
Add additional asserts to code to catch similar bugs in future.

Reported-by @xairy
2019-07-02 14:49:44 +02:00

92 lines
1.9 KiB
Go

// Copyright 2017 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
package prog
import (
"fmt"
"math/rand"
"os"
"testing"
"time"
)
// Export guts for testing.
func init() {
debug = true
}
var (
CalcChecksumsCall = calcChecksumsCall
InitTest = initTest
)
func initTargetTest(t *testing.T, os, arch string) *Target {
t.Parallel()
target, err := GetTarget(os, arch)
if err != nil {
t.Fatal(err)
}
return target
}
func randSource(t *testing.T) rand.Source {
seed := time.Now().UnixNano()
if os.Getenv("TRAVIS") != "" {
seed = 0 // required for deterministic coverage reports
}
t.Logf("seed=%v", seed)
return rand.NewSource(seed)
}
func iterCount() int {
iters := 1000
if testing.Short() {
iters /= 10
}
if raceEnabled {
iters /= 10
}
return iters
}
func initRandomTargetTest(t *testing.T, os, arch string) (*Target, rand.Source, int) {
target := initTargetTest(t, os, arch)
return target, randSource(t), iterCount()
}
func initTest(t *testing.T) (*Target, rand.Source, int) {
return initRandomTargetTest(t, "linux", "amd64")
}
func testEachTarget(t *testing.T, fn func(t *testing.T, target *Target)) {
t.Parallel()
for _, target := range AllTargets() {
target := target
t.Run(fmt.Sprintf("%v/%v", target.OS, target.Arch), func(t *testing.T) {
t.Parallel()
fn(t, target)
})
}
}
func testEachTargetRandom(t *testing.T, fn func(t *testing.T, target *Target, rs rand.Source, iters int)) {
t.Parallel()
targets := AllTargets()
iters := iterCount()
iters /= len(targets)
if iters < 3 {
iters = 3
}
rs0 := randSource(t)
for _, target := range targets {
target := target
rs := rand.NewSource(rs0.Int63())
t.Run(fmt.Sprintf("%v/%v", target.OS, target.Arch), func(t *testing.T) {
t.Parallel()
fn(t, target, rs, iters)
})
}
}