|
|
@ -0,0 +1,78 @@ |
|
|
|
package fail |
|
|
|
|
|
|
|
import ( |
|
|
|
"fmt" |
|
|
|
"math/rand" |
|
|
|
"os" |
|
|
|
"strconv" |
|
|
|
) |
|
|
|
|
|
|
|
var callIndexToFail int |
|
|
|
|
|
|
|
func init() { |
|
|
|
callIndexToFailS := os.Getenv("FAIL_TEST_INDEX") |
|
|
|
|
|
|
|
if callIndexToFailS == "" { |
|
|
|
callIndexToFail = -1 |
|
|
|
} else { |
|
|
|
var err error |
|
|
|
callIndexToFail, err = strconv.Atoi(callIndexToFailS) |
|
|
|
if err != nil { |
|
|
|
callIndexToFail = -1 |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Fail when FAIL_TEST_INDEX == callIndex
|
|
|
|
var ( |
|
|
|
callIndex int //indexes Fail calls
|
|
|
|
|
|
|
|
callRandIndex int // indexes a run of FailRand calls
|
|
|
|
callRandIndexToFail = -1 // the callRandIndex to fail on in FailRand
|
|
|
|
) |
|
|
|
|
|
|
|
func Fail() { |
|
|
|
if callIndexToFail < 0 { |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
if callIndex == callIndexToFail { |
|
|
|
Exit() |
|
|
|
} |
|
|
|
|
|
|
|
callIndex += 1 |
|
|
|
} |
|
|
|
|
|
|
|
// FailRand should be called n successive times.
|
|
|
|
// It will fail on a random one of those calls
|
|
|
|
// n must be greater than 0
|
|
|
|
func FailRand(n int) { |
|
|
|
if callIndexToFail < 0 { |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
if callRandIndexToFail < 0 { |
|
|
|
// first call in the loop, pick a random index to fail at
|
|
|
|
callRandIndexToFail = rand.Intn(n) |
|
|
|
callRandIndex = 0 |
|
|
|
} |
|
|
|
|
|
|
|
if callIndex == callIndexToFail { |
|
|
|
if callRandIndex == callRandIndexToFail { |
|
|
|
Exit() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
callRandIndex += 1 |
|
|
|
|
|
|
|
if callRandIndex == n { |
|
|
|
callIndex += 1 |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func Exit() { |
|
|
|
fmt.Printf("*** fail-test %d ***\n", callIndex) |
|
|
|
proc, _ := os.FindProcess(os.Getpid()) |
|
|
|
proc.Signal(os.Interrupt) |
|
|
|
// panic(fmt.Sprintf("*** fail-test %d ***", callIndex))
|
|
|
|
} |