|
@@ -1,121 +1,121 @@
|
|
|
package alerting
|
|
package alerting
|
|
|
|
|
|
|
|
-import (
|
|
|
|
|
- "testing"
|
|
|
|
|
- "time"
|
|
|
|
|
-
|
|
|
|
|
- "github.com/benbjohnson/clock"
|
|
|
|
|
-)
|
|
|
|
|
-
|
|
|
|
|
-func inspectTick(tick time.Time, last time.Time, offset time.Duration, t *testing.T) {
|
|
|
|
|
- if !tick.Equal(last.Add(time.Duration(1) * time.Second)) {
|
|
|
|
|
- t.Fatalf("expected a tick 1 second more than prev, %s. got: %s", last, tick)
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// returns the new last tick seen
|
|
|
|
|
-func assertAdvanceUntil(ticker *Ticker, last, desiredLast time.Time, offset, wait time.Duration, t *testing.T) time.Time {
|
|
|
|
|
- for {
|
|
|
|
|
- select {
|
|
|
|
|
- case tick := <-ticker.C:
|
|
|
|
|
- inspectTick(tick, last, offset, t)
|
|
|
|
|
- last = tick
|
|
|
|
|
- case <-time.NewTimer(wait).C:
|
|
|
|
|
- if last.Before(desiredLast) {
|
|
|
|
|
- t.Fatalf("waited %s for ticker to advance to %s, but only went up to %s", wait, desiredLast, last)
|
|
|
|
|
- }
|
|
|
|
|
- if last.After(desiredLast) {
|
|
|
|
|
- t.Fatalf("timer advanced too far. should only have gone up to %s, but it went up to %s", desiredLast, last)
|
|
|
|
|
- }
|
|
|
|
|
- return last
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func assertNoAdvance(ticker *Ticker, desiredLast time.Time, wait time.Duration, t *testing.T) {
|
|
|
|
|
- for {
|
|
|
|
|
- select {
|
|
|
|
|
- case tick := <-ticker.C:
|
|
|
|
|
- t.Fatalf("timer should have stayed at %s, instead it advanced to %s", desiredLast, tick)
|
|
|
|
|
- case <-time.NewTimer(wait).C:
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func TestTickerRetro1Hour(t *testing.T) {
|
|
|
|
|
- offset := time.Duration(10) * time.Second
|
|
|
|
|
- last := time.Unix(0, 0)
|
|
|
|
|
- mock := clock.NewMock()
|
|
|
|
|
- mock.Add(time.Duration(1) * time.Hour)
|
|
|
|
|
- desiredLast := mock.Now().Add(-offset)
|
|
|
|
|
- ticker := NewTicker(last, offset, mock)
|
|
|
|
|
-
|
|
|
|
|
- last = assertAdvanceUntil(ticker, last, desiredLast, offset, time.Duration(10)*time.Millisecond, t)
|
|
|
|
|
- assertNoAdvance(ticker, last, time.Duration(500)*time.Millisecond, t)
|
|
|
|
|
-
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func TestAdvanceWithUpdateOffset(t *testing.T) {
|
|
|
|
|
- offset := time.Duration(10) * time.Second
|
|
|
|
|
- last := time.Unix(0, 0)
|
|
|
|
|
- mock := clock.NewMock()
|
|
|
|
|
- mock.Add(time.Duration(1) * time.Hour)
|
|
|
|
|
- desiredLast := mock.Now().Add(-offset)
|
|
|
|
|
- ticker := NewTicker(last, offset, mock)
|
|
|
|
|
-
|
|
|
|
|
- last = assertAdvanceUntil(ticker, last, desiredLast, offset, time.Duration(10)*time.Millisecond, t)
|
|
|
|
|
- assertNoAdvance(ticker, last, time.Duration(500)*time.Millisecond, t)
|
|
|
|
|
-
|
|
|
|
|
- // lowering offset should see a few more ticks
|
|
|
|
|
- offset = time.Duration(5) * time.Second
|
|
|
|
|
- ticker.updateOffset(offset)
|
|
|
|
|
- desiredLast = mock.Now().Add(-offset)
|
|
|
|
|
- last = assertAdvanceUntil(ticker, last, desiredLast, offset, time.Duration(9)*time.Millisecond, t)
|
|
|
|
|
- assertNoAdvance(ticker, last, time.Duration(500)*time.Millisecond, t)
|
|
|
|
|
-
|
|
|
|
|
- // advancing clock should see even more ticks
|
|
|
|
|
- mock.Add(time.Duration(1) * time.Hour)
|
|
|
|
|
- desiredLast = mock.Now().Add(-offset)
|
|
|
|
|
- last = assertAdvanceUntil(ticker, last, desiredLast, offset, time.Duration(8)*time.Millisecond, t)
|
|
|
|
|
- assertNoAdvance(ticker, last, time.Duration(500)*time.Millisecond, t)
|
|
|
|
|
-
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func getCase(lastSeconds, offsetSeconds int) (time.Time, time.Duration) {
|
|
|
|
|
- last := time.Unix(int64(lastSeconds), 0)
|
|
|
|
|
- offset := time.Duration(offsetSeconds) * time.Second
|
|
|
|
|
- return last, offset
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func TestTickerNoAdvance(t *testing.T) {
|
|
|
|
|
-
|
|
|
|
|
- // it's 00:01:00 now. what are some cases where we don't want the ticker to advance?
|
|
|
|
|
- mock := clock.NewMock()
|
|
|
|
|
- mock.Add(time.Duration(60) * time.Second)
|
|
|
|
|
-
|
|
|
|
|
- type Case struct {
|
|
|
|
|
- last int
|
|
|
|
|
- offset int
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // note that some cases add up to now, others go into the future
|
|
|
|
|
- cases := []Case{
|
|
|
|
|
- {50, 10},
|
|
|
|
|
- {50, 30},
|
|
|
|
|
- {59, 1},
|
|
|
|
|
- {59, 10},
|
|
|
|
|
- {59, 30},
|
|
|
|
|
- {60, 1},
|
|
|
|
|
- {60, 10},
|
|
|
|
|
- {60, 30},
|
|
|
|
|
- {90, 1},
|
|
|
|
|
- {90, 10},
|
|
|
|
|
- {90, 30},
|
|
|
|
|
- }
|
|
|
|
|
- for _, c := range cases {
|
|
|
|
|
- last, offset := getCase(c.last, c.offset)
|
|
|
|
|
- ticker := NewTicker(last, offset, mock)
|
|
|
|
|
- assertNoAdvance(ticker, last, time.Duration(500)*time.Millisecond, t)
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
|
|
+//import (
|
|
|
|
|
+// "testing"
|
|
|
|
|
+// "time"
|
|
|
|
|
+//
|
|
|
|
|
+// "github.com/benbjohnson/clock"
|
|
|
|
|
+//)
|
|
|
|
|
+//
|
|
|
|
|
+//func inspectTick(tick time.Time, last time.Time, offset time.Duration, t *testing.T) {
|
|
|
|
|
+// if !tick.Equal(last.Add(time.Duration(1) * time.Second)) {
|
|
|
|
|
+// t.Fatalf("expected a tick 1 second more than prev, %s. got: %s", last, tick)
|
|
|
|
|
+// }
|
|
|
|
|
+//}
|
|
|
|
|
+//
|
|
|
|
|
+//// returns the new last tick seen
|
|
|
|
|
+//func assertAdvanceUntil(ticker *Ticker, last, desiredLast time.Time, offset, wait time.Duration, t *testing.T) time.Time {
|
|
|
|
|
+// for {
|
|
|
|
|
+// select {
|
|
|
|
|
+// case tick := <-ticker.C:
|
|
|
|
|
+// inspectTick(tick, last, offset, t)
|
|
|
|
|
+// last = tick
|
|
|
|
|
+// case <-time.NewTimer(wait).C:
|
|
|
|
|
+// if last.Before(desiredLast) {
|
|
|
|
|
+// t.Fatalf("waited %s for ticker to advance to %s, but only went up to %s", wait, desiredLast, last)
|
|
|
|
|
+// }
|
|
|
|
|
+// if last.After(desiredLast) {
|
|
|
|
|
+// t.Fatalf("timer advanced too far. should only have gone up to %s, but it went up to %s", desiredLast, last)
|
|
|
|
|
+// }
|
|
|
|
|
+// return last
|
|
|
|
|
+// }
|
|
|
|
|
+// }
|
|
|
|
|
+//}
|
|
|
|
|
+//
|
|
|
|
|
+//func assertNoAdvance(ticker *Ticker, desiredLast time.Time, wait time.Duration, t *testing.T) {
|
|
|
|
|
+// for {
|
|
|
|
|
+// select {
|
|
|
|
|
+// case tick := <-ticker.C:
|
|
|
|
|
+// t.Fatalf("timer should have stayed at %s, instead it advanced to %s", desiredLast, tick)
|
|
|
|
|
+// case <-time.NewTimer(wait).C:
|
|
|
|
|
+// return
|
|
|
|
|
+// }
|
|
|
|
|
+// }
|
|
|
|
|
+//}
|
|
|
|
|
+//
|
|
|
|
|
+//func TestTickerRetro1Hour(t *testing.T) {
|
|
|
|
|
+// offset := time.Duration(10) * time.Second
|
|
|
|
|
+// last := time.Unix(0, 0)
|
|
|
|
|
+// mock := clock.NewMock()
|
|
|
|
|
+// mock.Add(time.Duration(1) * time.Hour)
|
|
|
|
|
+// desiredLast := mock.Now().Add(-offset)
|
|
|
|
|
+// ticker := NewTicker(last, offset, mock)
|
|
|
|
|
+//
|
|
|
|
|
+// last = assertAdvanceUntil(ticker, last, desiredLast, offset, time.Duration(10)*time.Millisecond, t)
|
|
|
|
|
+// assertNoAdvance(ticker, last, time.Duration(500)*time.Millisecond, t)
|
|
|
|
|
+//
|
|
|
|
|
+//}
|
|
|
|
|
+//
|
|
|
|
|
+//func TestAdvanceWithUpdateOffset(t *testing.T) {
|
|
|
|
|
+// offset := time.Duration(10) * time.Second
|
|
|
|
|
+// last := time.Unix(0, 0)
|
|
|
|
|
+// mock := clock.NewMock()
|
|
|
|
|
+// mock.Add(time.Duration(1) * time.Hour)
|
|
|
|
|
+// desiredLast := mock.Now().Add(-offset)
|
|
|
|
|
+// ticker := NewTicker(last, offset, mock)
|
|
|
|
|
+//
|
|
|
|
|
+// last = assertAdvanceUntil(ticker, last, desiredLast, offset, time.Duration(10)*time.Millisecond, t)
|
|
|
|
|
+// assertNoAdvance(ticker, last, time.Duration(500)*time.Millisecond, t)
|
|
|
|
|
+//
|
|
|
|
|
+// // lowering offset should see a few more ticks
|
|
|
|
|
+// offset = time.Duration(5) * time.Second
|
|
|
|
|
+// ticker.updateOffset(offset)
|
|
|
|
|
+// desiredLast = mock.Now().Add(-offset)
|
|
|
|
|
+// last = assertAdvanceUntil(ticker, last, desiredLast, offset, time.Duration(9)*time.Millisecond, t)
|
|
|
|
|
+// assertNoAdvance(ticker, last, time.Duration(500)*time.Millisecond, t)
|
|
|
|
|
+//
|
|
|
|
|
+// // advancing clock should see even more ticks
|
|
|
|
|
+// mock.Add(time.Duration(1) * time.Hour)
|
|
|
|
|
+// desiredLast = mock.Now().Add(-offset)
|
|
|
|
|
+// last = assertAdvanceUntil(ticker, last, desiredLast, offset, time.Duration(8)*time.Millisecond, t)
|
|
|
|
|
+// assertNoAdvance(ticker, last, time.Duration(500)*time.Millisecond, t)
|
|
|
|
|
+//
|
|
|
|
|
+//}
|
|
|
|
|
+//
|
|
|
|
|
+//func getCase(lastSeconds, offsetSeconds int) (time.Time, time.Duration) {
|
|
|
|
|
+// last := time.Unix(int64(lastSeconds), 0)
|
|
|
|
|
+// offset := time.Duration(offsetSeconds) * time.Second
|
|
|
|
|
+// return last, offset
|
|
|
|
|
+//}
|
|
|
|
|
+//
|
|
|
|
|
+//func TestTickerNoAdvance(t *testing.T) {
|
|
|
|
|
+//
|
|
|
|
|
+// // it's 00:01:00 now. what are some cases where we don't want the ticker to advance?
|
|
|
|
|
+// mock := clock.NewMock()
|
|
|
|
|
+// mock.Add(time.Duration(60) * time.Second)
|
|
|
|
|
+//
|
|
|
|
|
+// type Case struct {
|
|
|
|
|
+// last int
|
|
|
|
|
+// offset int
|
|
|
|
|
+// }
|
|
|
|
|
+//
|
|
|
|
|
+// // note that some cases add up to now, others go into the future
|
|
|
|
|
+// cases := []Case{
|
|
|
|
|
+// {50, 10},
|
|
|
|
|
+// {50, 30},
|
|
|
|
|
+// {59, 1},
|
|
|
|
|
+// {59, 10},
|
|
|
|
|
+// {59, 30},
|
|
|
|
|
+// {60, 1},
|
|
|
|
|
+// {60, 10},
|
|
|
|
|
+// {60, 30},
|
|
|
|
|
+// {90, 1},
|
|
|
|
|
+// {90, 10},
|
|
|
|
|
+// {90, 30},
|
|
|
|
|
+// }
|
|
|
|
|
+// for _, c := range cases {
|
|
|
|
|
+// last, offset := getCase(c.last, c.offset)
|
|
|
|
|
+// ticker := NewTicker(last, offset, mock)
|
|
|
|
|
+// assertNoAdvance(ticker, last, time.Duration(500)*time.Millisecond, t)
|
|
|
|
|
+// }
|
|
|
|
|
+//}
|