github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/apiserver/retrystrategy/retrystrategy_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Copyright 2016 Cloudbase Solutions 3 // Licensed under the AGPLv3, see LICENCE file for details. 4 5 package retrystrategy_test 6 7 import ( 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/apiserver/common" 12 "github.com/juju/juju/apiserver/params" 13 "github.com/juju/juju/apiserver/retrystrategy" 14 apiservertesting "github.com/juju/juju/apiserver/testing" 15 jujutesting "github.com/juju/juju/juju/testing" 16 "github.com/juju/juju/state" 17 statetesting "github.com/juju/juju/state/testing" 18 jujufactory "github.com/juju/juju/testing/factory" 19 ) 20 21 var _ = gc.Suite(&retryStrategySuite{}) 22 23 type retryStrategySuite struct { 24 jujutesting.JujuConnSuite 25 26 authorizer apiservertesting.FakeAuthorizer 27 resources *common.Resources 28 29 factory *jujufactory.Factory 30 31 unit *state.Unit 32 33 strategy retrystrategy.RetryStrategy 34 } 35 36 var tagsTests = []struct { 37 tag string 38 expectedErr string 39 }{ 40 {"user-admin", "permission denied"}, 41 {"unit-wut-4", "permission denied"}, 42 {"definitelynotatag", `"definitelynotatag" is not a valid tag`}, 43 {"machine-5", "permission denied"}, 44 } 45 46 func (s *retryStrategySuite) SetUpTest(c *gc.C) { 47 s.JujuConnSuite.SetUpTest(c) 48 49 s.factory = jujufactory.NewFactory(s.State) 50 s.unit = s.factory.MakeUnit(c, nil) 51 52 // Create a FakeAuthorizer so we can check permissions, 53 // set up assuming unit 0 has logged in. 54 s.authorizer = apiservertesting.FakeAuthorizer{ 55 Tag: s.unit.UnitTag(), 56 } 57 58 // Create the resource registry separately to track invocations to 59 // Register. 60 s.resources = common.NewResources() 61 s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() }) 62 63 strategy, err := retrystrategy.NewRetryStrategyAPI(s.State, s.resources, s.authorizer) 64 c.Assert(err, jc.ErrorIsNil) 65 s.strategy = strategy 66 } 67 68 func (s *retryStrategySuite) TestRetryStrategyUnauthenticated(c *gc.C) { 69 svc, err := s.unit.Application() 70 c.Assert(err, jc.ErrorIsNil) 71 otherUnit := s.factory.MakeUnit(c, &jujufactory.UnitParams{Application: svc}) 72 args := params.Entities{Entities: []params.Entity{{otherUnit.Tag().String()}}} 73 74 res, err := s.strategy.RetryStrategy(args) 75 c.Assert(err, jc.ErrorIsNil) 76 c.Assert(res.Results, gc.HasLen, 1) 77 c.Assert(res.Results[0].Error, gc.ErrorMatches, "permission denied") 78 c.Assert(res.Results[0].Result, gc.IsNil) 79 } 80 81 func (s *retryStrategySuite) TestRetryStrategyBadTag(c *gc.C) { 82 args := params.Entities{Entities: make([]params.Entity, len(tagsTests))} 83 for i, t := range tagsTests { 84 args.Entities[i] = params.Entity{Tag: t.tag} 85 } 86 res, err := s.strategy.RetryStrategy(args) 87 c.Assert(err, jc.ErrorIsNil) 88 c.Assert(res.Results, gc.HasLen, len(tagsTests)) 89 for i, r := range res.Results { 90 c.Logf("result %d", i) 91 c.Assert(r.Error, gc.ErrorMatches, tagsTests[i].expectedErr) 92 c.Assert(res.Results[i].Result, gc.IsNil) 93 } 94 } 95 96 func (s *retryStrategySuite) TestRetryStrategy(c *gc.C) { 97 expected := ¶ms.RetryStrategy{ 98 ShouldRetry: true, 99 MinRetryTime: retrystrategy.MinRetryTime, 100 MaxRetryTime: retrystrategy.MaxRetryTime, 101 JitterRetryTime: retrystrategy.JitterRetryTime, 102 RetryTimeFactor: retrystrategy.RetryTimeFactor, 103 } 104 args := params.Entities{Entities: []params.Entity{{Tag: s.unit.Tag().String()}}} 105 r, err := s.strategy.RetryStrategy(args) 106 c.Assert(err, jc.ErrorIsNil) 107 c.Assert(r.Results, gc.HasLen, 1) 108 c.Assert(r.Results[0].Error, gc.IsNil) 109 c.Assert(r.Results[0].Result, jc.DeepEquals, expected) 110 111 s.setRetryStrategy(c, false) 112 expected.ShouldRetry = false 113 114 r, err = s.strategy.RetryStrategy(args) 115 c.Assert(err, jc.ErrorIsNil) 116 c.Assert(r.Results, gc.HasLen, 1) 117 c.Assert(r.Results[0].Error, gc.IsNil) 118 c.Assert(r.Results[0].Result, jc.DeepEquals, expected) 119 } 120 121 func (s *retryStrategySuite) setRetryStrategy(c *gc.C, automaticallyRetryHooks bool) { 122 err := s.State.UpdateModelConfig(map[string]interface{}{"automatically-retry-hooks": automaticallyRetryHooks}, nil, nil) 123 c.Assert(err, jc.ErrorIsNil) 124 envConfig, err := s.State.ModelConfig() 125 c.Assert(err, jc.ErrorIsNil) 126 c.Assert(envConfig.AutomaticallyRetryHooks(), gc.Equals, automaticallyRetryHooks) 127 } 128 129 func (s *retryStrategySuite) TestWatchRetryStrategyUnauthenticated(c *gc.C) { 130 svc, err := s.unit.Application() 131 c.Assert(err, jc.ErrorIsNil) 132 otherUnit := s.factory.MakeUnit(c, &jujufactory.UnitParams{Application: svc}) 133 args := params.Entities{Entities: []params.Entity{{otherUnit.Tag().String()}}} 134 135 res, err := s.strategy.WatchRetryStrategy(args) 136 c.Assert(err, jc.ErrorIsNil) 137 c.Assert(res.Results, gc.HasLen, 1) 138 c.Assert(res.Results[0].Error, gc.ErrorMatches, "permission denied") 139 c.Assert(res.Results[0].NotifyWatcherId, gc.Equals, "") 140 } 141 142 func (s *retryStrategySuite) TestWatchRetryStrategyBadTag(c *gc.C) { 143 args := params.Entities{Entities: make([]params.Entity, len(tagsTests))} 144 for i, t := range tagsTests { 145 args.Entities[i] = params.Entity{Tag: t.tag} 146 } 147 res, err := s.strategy.WatchRetryStrategy(args) 148 c.Assert(err, jc.ErrorIsNil) 149 c.Assert(res.Results, gc.HasLen, len(tagsTests)) 150 for i, r := range res.Results { 151 c.Logf("result %d", i) 152 c.Assert(r.Error, gc.ErrorMatches, tagsTests[i].expectedErr) 153 c.Assert(res.Results[i].NotifyWatcherId, gc.Equals, "") 154 } 155 } 156 157 func (s *retryStrategySuite) TestWatchRetryStrategy(c *gc.C) { 158 c.Assert(s.resources.Count(), gc.Equals, 0) 159 160 args := params.Entities{Entities: []params.Entity{ 161 {Tag: s.unit.UnitTag().String()}, 162 {Tag: "unit-foo-42"}, 163 }} 164 r, err := s.strategy.WatchRetryStrategy(args) 165 c.Assert(err, jc.ErrorIsNil) 166 c.Assert(r, gc.DeepEquals, params.NotifyWatchResults{ 167 Results: []params.NotifyWatchResult{ 168 {NotifyWatcherId: "1"}, 169 {Error: apiservertesting.ErrUnauthorized}, 170 }, 171 }) 172 173 c.Assert(s.resources.Count(), gc.Equals, 1) 174 resource := s.resources.Get("1") 175 defer statetesting.AssertStop(c, resource) 176 177 wc := statetesting.NewNotifyWatcherC(c, s.State, resource.(state.NotifyWatcher)) 178 wc.AssertNoChange() 179 180 s.setRetryStrategy(c, false) 181 c.Assert(err, jc.ErrorIsNil) 182 wc.AssertOneChange() 183 }