github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/state/configvalidator_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package state_test 5 6 import ( 7 "github.com/juju/errors" 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/environs/config" 12 "github.com/juju/juju/state" 13 coretesting "github.com/juju/juju/testing" 14 ) 15 16 type ConfigValidatorSuite struct { 17 ConnSuite 18 configValidator mockConfigValidator 19 } 20 21 var _ = gc.Suite(&ConfigValidatorSuite{}) 22 23 type mockConfigValidator struct { 24 validateError error 25 validateCfg *config.Config 26 validateOld *config.Config 27 validateValid *config.Config 28 } 29 30 // To test UpdateModelConfig updates state, Validate returns a config 31 // different to both input configs 32 func mockValidCfg() (valid *config.Config, err error) { 33 cfg, err := config.New(config.UseDefaults, coretesting.FakeConfig()) 34 if err != nil { 35 return nil, err 36 } 37 valid, err = cfg.Apply(map[string]interface{}{ 38 "arbitrary-key": "cptn-marvel", 39 }) 40 if err != nil { 41 return nil, err 42 } 43 return valid, nil 44 } 45 46 func (p *mockConfigValidator) Validate(cfg, old *config.Config) (valid *config.Config, err error) { 47 p.validateCfg = cfg 48 p.validateOld = old 49 p.validateValid, p.validateError = mockValidCfg() 50 return p.validateValid, p.validateError 51 } 52 53 func (s *ConfigValidatorSuite) SetUpTest(c *gc.C) { 54 s.ConnSuite.SetUpTest(c) 55 s.configValidator = mockConfigValidator{} 56 s.policy.GetConfigValidator = func(string) (state.ConfigValidator, error) { 57 return &s.configValidator, nil 58 } 59 } 60 61 func (s *ConfigValidatorSuite) updateModelConfig(c *gc.C) error { 62 updateAttrs := map[string]interface{}{ 63 "authorized-keys": "different-keys", 64 "arbitrary-key": "shazam!", 65 } 66 return s.State.UpdateModelConfig(updateAttrs, nil, nil) 67 } 68 69 func (s *ConfigValidatorSuite) TestConfigValidate(c *gc.C) { 70 err := s.updateModelConfig(c) 71 c.Assert(err, jc.ErrorIsNil) 72 } 73 74 func (s *ConfigValidatorSuite) TestUpdateModelConfigFailsOnConfigValidateError(c *gc.C) { 75 var configValidatorErr error 76 s.policy.GetConfigValidator = func(string) (state.ConfigValidator, error) { 77 configValidatorErr = errors.NotFoundf("") 78 return &s.configValidator, configValidatorErr 79 } 80 81 err := s.updateModelConfig(c) 82 c.Assert(err, gc.ErrorMatches, " not found") 83 } 84 85 func (s *ConfigValidatorSuite) TestUpdateModelConfigUpdatesState(c *gc.C) { 86 s.updateModelConfig(c) 87 stateCfg, err := s.State.ModelConfig() 88 c.Assert(err, jc.ErrorIsNil) 89 newValidCfg, err := mockValidCfg() 90 c.Assert(err, jc.ErrorIsNil) 91 c.Assert(stateCfg.AllAttrs()["arbitrary-key"], gc.Equals, newValidCfg.AllAttrs()["arbitrary-key"]) 92 } 93 94 func (s *ConfigValidatorSuite) TestConfigValidateUnimplemented(c *gc.C) { 95 var configValidatorErr error 96 s.policy.GetConfigValidator = func(string) (state.ConfigValidator, error) { 97 return nil, configValidatorErr 98 } 99 100 err := s.updateModelConfig(c) 101 c.Assert(err, gc.ErrorMatches, "policy returned nil configValidator without an error") 102 configValidatorErr = errors.NotImplementedf("Validator") 103 err = s.updateModelConfig(c) 104 c.Assert(err, jc.ErrorIsNil) 105 } 106 107 func (s *ConfigValidatorSuite) TestConfigValidateNoPolicy(c *gc.C) { 108 s.policy.GetConfigValidator = func(providerType string) (state.ConfigValidator, error) { 109 c.Errorf("should not have been invoked") 110 return nil, nil 111 } 112 113 state.SetPolicy(s.State, nil) 114 err := s.updateModelConfig(c) 115 c.Assert(err, jc.ErrorIsNil) 116 }