github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/apiserver/cleaner/cleaner_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package cleaner_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/testing" 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/apiserver/cleaner" 13 "github.com/juju/juju/apiserver/common" 14 "github.com/juju/juju/apiserver/params" 15 apiservertesting "github.com/juju/juju/apiserver/testing" 16 "github.com/juju/juju/state" 17 coretesting "github.com/juju/juju/testing" 18 ) 19 20 type CleanerSuite struct { 21 coretesting.BaseSuite 22 23 st *mockState 24 api *cleaner.CleanerAPI 25 authoriser apiservertesting.FakeAuthorizer 26 } 27 28 var _ = gc.Suite(&CleanerSuite{}) 29 30 func (s *CleanerSuite) SetUpTest(c *gc.C) { 31 s.BaseSuite.SetUpTest(c) 32 33 s.authoriser = apiservertesting.FakeAuthorizer{ 34 EnvironManager: true, 35 } 36 s.st = &mockState{&testing.Stub{}, false} 37 cleaner.PatchState(s, s.st) 38 var err error 39 res := common.NewResources() 40 s.api, err = cleaner.NewCleanerAPI(nil, res, s.authoriser) 41 c.Assert(err, jc.ErrorIsNil) 42 c.Assert(s.api, gc.NotNil) 43 } 44 45 func (s *CleanerSuite) TestNewCleanerAPIRequiresEnvironManager(c *gc.C) { 46 anAuthoriser := s.authoriser 47 anAuthoriser.EnvironManager = false 48 api, err := cleaner.NewCleanerAPI(nil, nil, anAuthoriser) 49 c.Assert(api, gc.IsNil) 50 c.Assert(err, gc.ErrorMatches, "permission denied") 51 c.Assert(common.ServerError(err), jc.Satisfies, params.IsCodeUnauthorized) 52 } 53 54 func (s *CleanerSuite) TestWatchCleanupsSuccess(c *gc.C) { 55 _, err := s.api.WatchCleanups() 56 c.Assert(err, jc.ErrorIsNil) 57 s.st.CheckCallNames(c, "WatchCleanups") 58 } 59 60 func (s *CleanerSuite) TestWatchCleanupsFailure(c *gc.C) { 61 s.st.SetErrors(errors.New("boom!")) 62 s.st.watchCleanupsFails = true 63 64 result, err := s.api.WatchCleanups() 65 c.Assert(err, jc.ErrorIsNil) 66 c.Assert(result.Error.Error(), gc.Equals, "boom!") 67 s.st.CheckCallNames(c, "WatchCleanups") 68 } 69 70 func (s *CleanerSuite) TestCleanupSuccess(c *gc.C) { 71 err := s.api.Cleanup() 72 c.Assert(err, jc.ErrorIsNil) 73 s.st.CheckCallNames(c, "Cleanup") 74 } 75 76 func (s *CleanerSuite) TestCleanupFailure(c *gc.C) { 77 s.st.SetErrors(errors.New("Boom!")) 78 err := s.api.Cleanup() 79 c.Assert(err, gc.ErrorMatches, "Boom!") 80 s.st.CheckCallNames(c, "Cleanup") 81 } 82 83 type mockState struct { 84 *testing.Stub 85 watchCleanupsFails bool 86 } 87 88 type cleanupWatcher struct { 89 out chan struct{} 90 st *mockState 91 } 92 93 func (w *cleanupWatcher) Changes() <-chan struct{} { 94 return w.out 95 } 96 97 func (w *cleanupWatcher) Stop() error { 98 return nil 99 } 100 101 func (w *cleanupWatcher) Kill() { 102 } 103 104 func (w *cleanupWatcher) Wait() error { 105 return nil 106 } 107 108 func (w *cleanupWatcher) Err() error { 109 return w.st.NextErr() 110 } 111 112 func (st *mockState) WatchCleanups() state.NotifyWatcher { 113 w := &cleanupWatcher{ 114 out: make(chan struct{}, 1), 115 st: st, 116 } 117 if st.watchCleanupsFails { 118 close(w.out) 119 } else { 120 w.out <- struct{}{} 121 } 122 st.MethodCall(st, "WatchCleanups") 123 return w 124 } 125 126 func (st *mockState) Cleanup() error { 127 st.MethodCall(st, "Cleanup") 128 return st.NextErr() 129 }