github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/controller/tracker_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package controller_test 5 6 import ( 7 jc "github.com/juju/testing/checkers" 8 gc "gopkg.in/check.v1" 9 10 "github.com/juju/juju/state" 11 statetesting "github.com/juju/juju/state/testing" 12 workercontroller "github.com/juju/juju/worker/controller" 13 ) 14 15 type TrackerSuite struct { 16 statetesting.StateSuite 17 ctlr *state.Controller 18 tracker workercontroller.Tracker 19 } 20 21 var _ = gc.Suite(&TrackerSuite{}) 22 23 func (s *TrackerSuite) SetUpTest(c *gc.C) { 24 s.StateSuite.SetUpTest(c) 25 s.tracker = workercontroller.NewTracker(s.Controller) 26 } 27 28 func (s *TrackerSuite) TestDoneWithNoUse(c *gc.C) { 29 err := s.tracker.Done() 30 c.Assert(err, jc.ErrorIsNil) 31 assertControllerClosed(c, s.Controller) 32 } 33 34 func (s *TrackerSuite) TestTooManyDones(c *gc.C) { 35 err := s.tracker.Done() 36 c.Assert(err, jc.ErrorIsNil) 37 assertControllerClosed(c, s.Controller) 38 39 err = s.tracker.Done() 40 c.Assert(err, gc.Equals, workercontroller.ErrControllerClosed) 41 assertControllerClosed(c, s.Controller) 42 } 43 44 func (s *TrackerSuite) TestUse(c *gc.C) { 45 st, err := s.tracker.Use() 46 c.Check(st, gc.Equals, s.Controller) 47 c.Check(err, jc.ErrorIsNil) 48 49 st, err = s.tracker.Use() 50 c.Check(st, gc.Equals, s.Controller) 51 c.Check(err, jc.ErrorIsNil) 52 } 53 54 func (s *TrackerSuite) TestUseAndDone(c *gc.C) { 55 // Ref count starts at 1 (the creator/owner) 56 57 _, err := s.tracker.Use() 58 // 2 59 c.Check(err, jc.ErrorIsNil) 60 61 _, err = s.tracker.Use() 62 // 3 63 c.Check(err, jc.ErrorIsNil) 64 65 c.Check(s.tracker.Done(), jc.ErrorIsNil) 66 // 2 67 assertControllerNotClosed(c, s.Controller) 68 69 _, err = s.tracker.Use() 70 // 3 71 c.Check(err, jc.ErrorIsNil) 72 73 c.Check(s.tracker.Done(), jc.ErrorIsNil) 74 // 2 75 assertControllerNotClosed(c, s.Controller) 76 77 c.Check(s.tracker.Done(), jc.ErrorIsNil) 78 // 1 79 assertControllerNotClosed(c, s.Controller) 80 81 c.Check(s.tracker.Done(), jc.ErrorIsNil) 82 // 0 83 assertControllerClosed(c, s.Controller) 84 } 85 86 func (s *TrackerSuite) TestUseWhenClosed(c *gc.C) { 87 c.Assert(s.tracker.Done(), jc.ErrorIsNil) 88 89 st, err := s.tracker.Use() 90 c.Check(st, gc.IsNil) 91 c.Check(err, gc.Equals, workercontroller.ErrControllerClosed) 92 } 93 94 func assertControllerNotClosed(c *gc.C, ctlr *state.Controller) { 95 err := ctlr.Ping() 96 c.Assert(err, jc.ErrorIsNil) 97 } 98 99 func assertControllerClosed(c *gc.C, ctlr *state.Controller) { 100 c.Assert(ctlr.Ping(), gc.ErrorMatches, "pool is closed") 101 }