You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
1.3 KiB

  1. package fail
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "os"
  6. "strconv"
  7. )
  8. var callIndexToFail int
  9. func init() {
  10. callIndexToFailS := os.Getenv("FAIL_TEST_INDEX")
  11. if callIndexToFailS == "" {
  12. callIndexToFail = -1
  13. } else {
  14. var err error
  15. callIndexToFail, err = strconv.Atoi(callIndexToFailS)
  16. if err != nil {
  17. callIndexToFail = -1
  18. }
  19. }
  20. }
  21. // Fail when FAIL_TEST_INDEX == callIndex
  22. var (
  23. callIndex int //indexes Fail calls
  24. callRandIndex int // indexes a run of FailRand calls
  25. callRandIndexToFail = -1 // the callRandIndex to fail on in FailRand
  26. )
  27. func Fail() {
  28. if callIndexToFail < 0 {
  29. return
  30. }
  31. if callIndex == callIndexToFail {
  32. Exit()
  33. }
  34. callIndex += 1
  35. }
  36. // FailRand should be called n successive times.
  37. // It will fail on a random one of those calls
  38. // n must be greater than 0
  39. func FailRand(n int) {
  40. if callIndexToFail < 0 {
  41. return
  42. }
  43. if callRandIndexToFail < 0 {
  44. // first call in the loop, pick a random index to fail at
  45. callRandIndexToFail = rand.Intn(n)
  46. callRandIndex = 0
  47. }
  48. if callIndex == callIndexToFail {
  49. if callRandIndex == callRandIndexToFail {
  50. Exit()
  51. }
  52. }
  53. callRandIndex += 1
  54. if callRandIndex == n {
  55. callIndex += 1
  56. }
  57. }
  58. func Exit() {
  59. fmt.Printf("*** fail-test %d ***\n", callIndex)
  60. proc, _ := os.FindProcess(os.Getpid())
  61. proc.Signal(os.Interrupt)
  62. // panic(fmt.Sprintf("*** fail-test %d ***", callIndex))
  63. }