github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/storageprovisioner/internal/schedule/schedule_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package schedule_test 5 6 import ( 7 "time" 8 9 jujutesting "github.com/juju/testing" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 coretesting "github.com/juju/juju/testing" 14 "github.com/juju/juju/worker/storageprovisioner/internal/schedule" 15 ) 16 17 type scheduleSuite struct { 18 coretesting.BaseSuite 19 } 20 21 var _ = gc.Suite(&scheduleSuite{}) 22 23 func (*scheduleSuite) TestNextNoEvents(c *gc.C) { 24 s := schedule.NewSchedule(jujutesting.NewClock(time.Time{})) 25 next := s.Next() 26 c.Assert(next, gc.IsNil) 27 } 28 29 func (*scheduleSuite) TestNext(c *gc.C) { 30 clock := jujutesting.NewClock(time.Time{}) 31 now := clock.Now() 32 s := schedule.NewSchedule(clock) 33 34 s.Add("k0", "v0", now.Add(3*time.Second)) 35 s.Add("k1", "v1", now.Add(1500*time.Millisecond)) 36 s.Add("k2", "v2", now.Add(2*time.Second)) 37 s.Add("k3", "v3", now.Add(2500*time.Millisecond)) 38 39 assertNextOp(c, s, clock, 1500*time.Millisecond) 40 clock.Advance(1500 * time.Millisecond) 41 assertReady(c, s, clock, "v1") 42 43 clock.Advance(500 * time.Millisecond) 44 assertNextOp(c, s, clock, 0) 45 assertReady(c, s, clock, "v2") 46 47 s.Remove("k3") 48 49 clock.Advance(2 * time.Second) // T+4 50 assertNextOp(c, s, clock, 0) 51 assertReady(c, s, clock, "v0") 52 } 53 54 func (*scheduleSuite) TestReadyNoEvents(c *gc.C) { 55 s := schedule.NewSchedule(jujutesting.NewClock(time.Time{})) 56 ready := s.Ready(time.Now()) 57 c.Assert(ready, gc.HasLen, 0) 58 } 59 60 func (*scheduleSuite) TestAdd(c *gc.C) { 61 clock := jujutesting.NewClock(time.Time{}) 62 now := clock.Now() 63 s := schedule.NewSchedule(clock) 64 65 s.Add("k0", "v0", now.Add(3*time.Second)) 66 s.Add("k1", "v1", now.Add(1500*time.Millisecond)) 67 s.Add("k2", "v2", now.Add(2*time.Second)) 68 69 clock.Advance(time.Second) // T+1 70 assertReady(c, s, clock /* nothing */) 71 72 clock.Advance(time.Second) // T+2 73 assertReady(c, s, clock, "v1", "v2") 74 assertReady(c, s, clock /* nothing */) 75 76 clock.Advance(500 * time.Millisecond) // T+2.5 77 assertReady(c, s, clock /* nothing */) 78 79 clock.Advance(time.Second) // T+3.5 80 assertReady(c, s, clock, "v0") 81 } 82 83 func (*scheduleSuite) TestRemove(c *gc.C) { 84 clock := jujutesting.NewClock(time.Time{}) 85 now := clock.Now() 86 s := schedule.NewSchedule(clock) 87 88 s.Add("k0", "v0", now.Add(3*time.Second)) 89 s.Add("k1", "v1", now.Add(2*time.Second)) 90 s.Remove("k0") 91 assertReady(c, s, clock /* nothing */) 92 93 clock.Advance(3 * time.Second) 94 assertReady(c, s, clock, "v1") 95 } 96 97 func (*scheduleSuite) TestRemoveKeyNotFound(c *gc.C) { 98 s := schedule.NewSchedule(jujutesting.NewClock(time.Time{})) 99 s.Remove("0") // does not explode 100 } 101 102 func assertNextOp(c *gc.C, s *schedule.Schedule, clock *jujutesting.Clock, d time.Duration) { 103 next := s.Next() 104 c.Assert(next, gc.NotNil) 105 if d > 0 { 106 select { 107 case <-next: 108 c.Fatal("Next channel signalled too soon") 109 default: 110 } 111 } 112 113 // temporarily move time forward 114 clock.Advance(d) 115 defer clock.Advance(-d) 116 117 select { 118 case _, ok := <-next: 119 c.Assert(ok, jc.IsTrue) 120 // the time value is unimportant to us 121 default: 122 c.Fatal("Next channel not signalled") 123 } 124 } 125 126 func assertReady(c *gc.C, s *schedule.Schedule, clock *jujutesting.Clock, expect ...interface{}) { 127 ready := s.Ready(clock.Now()) 128 c.Assert(ready, jc.DeepEquals, expect) 129 }