Home | History | Annotate | Download | only in prog
      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 	"time"
     11 )
     12 
     13 // Export guts for testing.
     14 
     15 func init() {
     16 	debug = true
     17 }
     18 
     19 var (
     20 	CalcChecksumsCall = calcChecksumsCall
     21 	InitTest          = initTest
     22 )
     23 
     24 func initTargetTest(t *testing.T, os, arch string) *Target {
     25 	t.Parallel()
     26 	target, err := GetTarget(os, arch)
     27 	if err != nil {
     28 		t.Fatal(err)
     29 	}
     30 	return target
     31 }
     32 
     33 func randSource(t *testing.T) rand.Source {
     34 	seed := int64(time.Now().UnixNano())
     35 	t.Logf("seed=%v", seed)
     36 	return rand.NewSource(seed)
     37 }
     38 
     39 func iterCount() int {
     40 	iters := 10000
     41 	if testing.Short() {
     42 		iters = 100
     43 	}
     44 	if raceEnabled {
     45 		iters /= 10
     46 	}
     47 	return iters
     48 }
     49 
     50 func initRandomTargetTest(t *testing.T, os, arch string) (*Target, rand.Source, int) {
     51 	target := initTargetTest(t, os, arch)
     52 	return target, randSource(t), iterCount()
     53 }
     54 
     55 func initTest(t *testing.T) (*Target, rand.Source, int) {
     56 	return initRandomTargetTest(t, "linux", "amd64")
     57 }
     58 
     59 func testEachTarget(t *testing.T, fn func(t *testing.T, target *Target)) {
     60 	t.Parallel()
     61 	for _, target := range AllTargets() {
     62 		target := target
     63 		t.Run(fmt.Sprintf("%v/%v", target.OS, target.Arch), func(t *testing.T) {
     64 			t.Parallel()
     65 			fn(t, target)
     66 		})
     67 	}
     68 }
     69 
     70 func testEachTargetRandom(t *testing.T, fn func(t *testing.T, target *Target, rs rand.Source, iters int)) {
     71 	t.Parallel()
     72 	targets := AllTargets()
     73 	iters := iterCount()
     74 	iters /= len(targets)
     75 	if iters < 3 {
     76 		iters = 3
     77 	}
     78 	rs0 := randSource(t)
     79 	for _, target := range targets {
     80 		target := target
     81 		rs := rand.NewSource(rs0.Int63())
     82 		t.Run(fmt.Sprintf("%v/%v", target.OS, target.Arch), func(t *testing.T) {
     83 			t.Parallel()
     84 			fn(t, target, rs, iters)
     85 		})
     86 	}
     87 }
     88