Skip to content

Commit d753e90

Browse files
committed
Replace ticker registrations when resetting and reject invalid periods
1 parent 6d8d032 commit d753e90

2 files changed

Lines changed: 56 additions & 0 deletions

File tree

‎ticker.go‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,12 @@ func newFakeTicker(fc *FakeClock, d time.Duration) *fakeTicker {
4141
c: make(chan time.Time, 1),
4242
d: d,
4343
reset: func(d time.Duration) {
44+
if d <= 0 {
45+
panic("non-positive interval for Ticker.Reset")
46+
}
4447
fc.l.Lock()
4548
defer fc.l.Unlock()
49+
fc.stopExpirer(ft)
4650
ft.d = d
4751
fc.setExpirer(ft, d)
4852
},

‎ticker_reset_test.go‎

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package clockwork
2+
3+
import (
4+
"testing"
5+
"time"
6+
)
7+
8+
func TestFakeTickerResetThenStop(t *testing.T) {
9+
fc := NewFakeClock()
10+
ticker := fc.NewTicker(time.Second)
11+
ticker.Reset(2 * time.Second)
12+
ticker.Reset(3 * time.Second)
13+
ticker.Stop()
14+
fc.Advance(10 * time.Second)
15+
select {
16+
case tick := <-ticker.Chan():
17+
t.Fatalf("stopped ticker fired at %v after being reset", tick)
18+
default:
19+
}
20+
ticker.Reset(2 * time.Second)
21+
defer ticker.Stop()
22+
fc.Advance(2 * time.Second)
23+
select {
24+
case <-ticker.Chan():
25+
default:
26+
t.Fatal("Reset did not restart the stopped ticker")
27+
}
28+
}
29+
30+
func TestFakeTickerResetNonPositive(t *testing.T) {
31+
for _, duration := range []time.Duration{0, -time.Second} {
32+
t.Run(duration.String(), func(t *testing.T) {
33+
fc := NewFakeClock()
34+
ticker := fc.NewTicker(time.Second)
35+
defer ticker.Stop()
36+
panicked := false
37+
func() {
38+
defer func() { panicked = recover() != nil }()
39+
ticker.Reset(duration)
40+
}()
41+
if !panicked {
42+
t.Fatal("Reset must panic for a non-positive duration")
43+
}
44+
fc.Advance(time.Second)
45+
select {
46+
case <-ticker.Chan():
47+
default:
48+
t.Fatal("invalid Reset changed the existing ticker schedule")
49+
}
50+
})
51+
}
52+
}

0 commit comments

Comments
 (0)