github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/prog/export_test.go (about) 1 // Copyright 2017 syzkaller project authors. All rights reserved. 2 // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 package prog 5 6 import ( 7 "fmt" 8 "math/rand" 9 "testing" 10 11 "github.com/google/syzkaller/pkg/testutil" 12 ) 13 14 // Export guts for testing. 15 16 func init() { 17 debug = true 18 } 19 20 var ( 21 CalcChecksumsCall = calcChecksumsCall 22 InitTest = initTest 23 initTargetTest = InitTargetTest 24 ) 25 26 func initRandomTargetTest(t *testing.T, os, arch string) (*Target, rand.Source, int) { 27 target := initTargetTest(t, os, arch) 28 return target, testutil.RandSource(t), testutil.IterCount() 29 } 30 31 func initTest(t *testing.T) (*Target, rand.Source, int) { 32 return initRandomTargetTest(t, "linux", "amd64") 33 } 34 35 func testEachTarget(t *testing.T, fn func(t *testing.T, target *Target)) { 36 t.Parallel() 37 for _, target := range AllTargets() { 38 t.Run(fmt.Sprintf("%v/%v", target.OS, target.Arch), func(t *testing.T) { 39 skipTargetRace(t, target) 40 t.Parallel() 41 fn(t, target) 42 }) 43 } 44 } 45 46 func testEachTargetRandom(t *testing.T, fn func(t *testing.T, target *Target, rs rand.Source, iters int)) { 47 t.Parallel() 48 targets := AllTargets() 49 iters := max(testutil.IterCount()/len(targets), 3) 50 rs0 := testutil.RandSource(t) 51 for _, target := range targets { 52 rs := rand.NewSource(rs0.Int63()) 53 t.Run(fmt.Sprintf("%v/%v", target.OS, target.Arch), func(t *testing.T) { 54 skipTargetRace(t, target) 55 t.Parallel() 56 fn(t, target, rs, iters) 57 }) 58 } 59 } 60 61 func skipTargetRace(t *testing.T, target *Target) { 62 // Race execution is slow and we are getting timeouts on CI. 63 // For tests that run for all targets, leave only 2 targets, 64 // this should be enough to detect some races. 65 if testutil.RaceEnabled && (target.OS != "test" || target.Arch != "64" && target.Arch != "32") { 66 t.Skip("skipping all but test/64 targets in race mode") 67 } 68 } 69 70 func initBench(b *testing.B) (*Target, func()) { 71 olddebug := debug 72 debug = false 73 target, err := GetTarget("linux", "amd64") 74 if err != nil { 75 b.Fatal(err) 76 } 77 b.ReportAllocs() 78 return target, func() { debug = olddebug } 79 }