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