attempt_test.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package util
  2. import (
  3. "testing"
  4. "time"
  5. )
  6. func TestAttemptTiming(t *testing.T) {
  7. testAttempt := AttemptStrategy{
  8. Total: 0.25e9,
  9. Delay: 0.1e9,
  10. }
  11. want := []time.Duration{0, 0.1e9, 0.2e9, 0.2e9}
  12. got := make([]time.Duration, 0, len(want)) // avoid allocation when testing timing
  13. t0 := time.Now()
  14. for a := testAttempt.Start(); a.Next(); {
  15. got = append(got, time.Now().Sub(t0))
  16. }
  17. got = append(got, time.Now().Sub(t0))
  18. if len(got) != len(want) {
  19. t.Fatalf("Failed!")
  20. }
  21. const margin = 0.01e9
  22. for i, got := range want {
  23. lo := want[i] - margin
  24. hi := want[i] + margin
  25. if got < lo || got > hi {
  26. t.Errorf("attempt %d want %g got %g", i, want[i].Seconds(), got.Seconds())
  27. }
  28. }
  29. }
  30. func TestAttemptNextHasNext(t *testing.T) {
  31. a := AttemptStrategy{}.Start()
  32. if !a.Next() {
  33. t.Fatalf("Failed!")
  34. }
  35. if a.Next() {
  36. t.Fatalf("Failed!")
  37. }
  38. a = AttemptStrategy{}.Start()
  39. if !a.Next() {
  40. t.Fatalf("Failed!")
  41. }
  42. if a.HasNext() {
  43. t.Fatalf("Failed!")
  44. }
  45. if a.Next() {
  46. t.Fatalf("Failed!")
  47. }
  48. a = AttemptStrategy{Total: 2e8}.Start()
  49. if !a.Next() {
  50. t.Fatalf("Failed!")
  51. }
  52. if !a.HasNext() {
  53. t.Fatalf("Failed!")
  54. }
  55. time.Sleep(2e8)
  56. if !a.HasNext() {
  57. t.Fatalf("Failed!")
  58. }
  59. if !a.Next() {
  60. t.Fatalf("Failed!")
  61. }
  62. if a.Next() {
  63. t.Fatalf("Failed!")
  64. }
  65. a = AttemptStrategy{Total: 1e8, Min: 2}.Start()
  66. time.Sleep(1e8)
  67. if !a.Next() {
  68. t.Fatalf("Failed!")
  69. }
  70. if !a.HasNext() {
  71. t.Fatalf("Failed!")
  72. }
  73. if !a.Next() {
  74. t.Fatalf("Failed!")
  75. }
  76. if a.HasNext() {
  77. t.Fatalf("Failed!")
  78. }
  79. if a.Next() {
  80. t.Fatalf("Failed!")
  81. }
  82. }