github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/worker/state/statetracker_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package state_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 workerstate "github.com/juju/juju/worker/state" 13 ) 14 15 type StateTrackerSuite struct { 16 statetesting.StateSuite 17 st *state.State 18 stateTracker workerstate.StateTracker 19 } 20 21 var _ = gc.Suite(&StateTrackerSuite{}) 22 23 func (s *StateTrackerSuite) SetUpTest(c *gc.C) { 24 s.StateSuite.SetUpTest(c) 25 s.stateTracker = workerstate.NewStateTracker(s.State) 26 } 27 28 func (s *StateTrackerSuite) TestDoneWithNoUse(c *gc.C) { 29 err := s.stateTracker.Done() 30 c.Assert(err, jc.ErrorIsNil) 31 assertStateClosed(c, s.State) 32 } 33 34 func (s *StateTrackerSuite) TestTooManyDones(c *gc.C) { 35 err := s.stateTracker.Done() 36 c.Assert(err, jc.ErrorIsNil) 37 assertStateClosed(c, s.State) 38 39 err = s.stateTracker.Done() 40 c.Assert(err, gc.Equals, workerstate.ErrStateClosed) 41 assertStateClosed(c, s.State) 42 } 43 44 func (s *StateTrackerSuite) TestUse(c *gc.C) { 45 st, err := s.stateTracker.Use() 46 c.Check(st, gc.Equals, s.State) 47 c.Check(err, jc.ErrorIsNil) 48 49 st, err = s.stateTracker.Use() 50 c.Check(st, gc.Equals, s.State) 51 c.Check(err, jc.ErrorIsNil) 52 } 53 54 func (s *StateTrackerSuite) TestUseAndDone(c *gc.C) { 55 // Ref count starts at 1 (the creator/owner) 56 57 _, err := s.stateTracker.Use() 58 // 2 59 c.Check(err, jc.ErrorIsNil) 60 61 _, err = s.stateTracker.Use() 62 // 3 63 c.Check(err, jc.ErrorIsNil) 64 65 c.Check(s.stateTracker.Done(), jc.ErrorIsNil) 66 // 2 67 assertStateNotClosed(c, s.State) 68 69 _, err = s.stateTracker.Use() 70 // 3 71 c.Check(err, jc.ErrorIsNil) 72 73 c.Check(s.stateTracker.Done(), jc.ErrorIsNil) 74 // 2 75 assertStateNotClosed(c, s.State) 76 77 c.Check(s.stateTracker.Done(), jc.ErrorIsNil) 78 // 1 79 assertStateNotClosed(c, s.State) 80 81 c.Check(s.stateTracker.Done(), jc.ErrorIsNil) 82 // 0 83 assertStateClosed(c, s.State) 84 } 85 86 func (s *StateTrackerSuite) TestUseWhenClosed(c *gc.C) { 87 c.Assert(s.stateTracker.Done(), jc.ErrorIsNil) 88 89 st, err := s.stateTracker.Use() 90 c.Check(st, gc.IsNil) 91 c.Check(err, gc.Equals, workerstate.ErrStateClosed) 92 } 93 94 func assertStateNotClosed(c *gc.C, st *state.State) { 95 err := st.Ping() 96 c.Assert(err, jc.ErrorIsNil) 97 } 98 99 func assertStateClosed(c *gc.C, st *state.State) { 100 c.Assert(st.Ping, gc.PanicMatches, "Session already closed") 101 }