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  }