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  }