github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/upgrades/environconfig_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package upgrades_test 5 6 import ( 7 "errors" 8 9 "github.com/juju/testing" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/environs" 14 "github.com/juju/juju/environs/config" 15 "github.com/juju/juju/state" 16 coretesting "github.com/juju/juju/testing" 17 "github.com/juju/juju/upgrades" 18 ) 19 20 type upgradeModelConfigSuite struct { 21 coretesting.BaseSuite 22 stub testing.Stub 23 cfg *config.Config 24 reader upgrades.ModelConfigReader 25 updater upgrades.ModelConfigUpdater 26 registry *mockProviderRegistry 27 } 28 29 var _ = gc.Suite(&upgradeModelConfigSuite{}) 30 31 func (s *upgradeModelConfigSuite) SetUpTest(c *gc.C) { 32 s.BaseSuite.SetUpTest(c) 33 34 s.stub = testing.Stub{} 35 s.cfg = coretesting.ModelConfig(c) 36 s.registry = &mockProviderRegistry{ 37 providers: make(map[string]environs.EnvironProvider), 38 } 39 40 s.reader = environConfigFunc(func() (*config.Config, error) { 41 s.stub.AddCall("ModelConfig") 42 return s.cfg, s.stub.NextErr() 43 }) 44 45 s.updater = updateModelConfigFunc(func( 46 update map[string]interface{}, remove []string, validate state.ValidateConfigFunc, 47 ) error { 48 s.stub.AddCall("UpdateModelConfig", update, remove, validate) 49 return s.stub.NextErr() 50 }) 51 } 52 53 func (s *upgradeModelConfigSuite) TestUpgradeModelConfigModelConfigError(c *gc.C) { 54 s.stub.SetErrors(errors.New("cannot read environ config")) 55 err := upgrades.UpgradeModelConfig(s.reader, s.updater, s.registry) 56 c.Assert(err, gc.ErrorMatches, "reading model config: cannot read environ config") 57 s.stub.CheckCallNames(c, "ModelConfig") 58 } 59 60 func (s *upgradeModelConfigSuite) TestUpgradeModelConfigProviderNotRegistered(c *gc.C) { 61 s.registry.SetErrors(errors.New(`no registered provider for "someprovider"`)) 62 err := upgrades.UpgradeModelConfig(s.reader, s.updater, s.registry) 63 c.Assert(err, gc.ErrorMatches, `getting provider: no registered provider for "someprovider"`) 64 s.stub.CheckCallNames(c, "ModelConfig") 65 } 66 67 func (s *upgradeModelConfigSuite) TestUpgradeModelConfigProviderNotConfigUpgrader(c *gc.C) { 68 s.registry.providers["someprovider"] = &mockEnvironProvider{} 69 err := upgrades.UpgradeModelConfig(s.reader, s.updater, s.registry) 70 c.Assert(err, jc.ErrorIsNil) 71 s.registry.CheckCalls(c, []testing.StubCall{{ 72 FuncName: "Provider", Args: []interface{}{"someprovider"}, 73 }}) 74 s.stub.CheckCallNames(c, "ModelConfig") 75 } 76 77 func (s *upgradeModelConfigSuite) TestUpgradeModelConfigProviderConfigUpgrader(c *gc.C) { 78 var err error 79 s.cfg, err = s.cfg.Apply(map[string]interface{}{"test-key": "test-value"}) 80 c.Assert(err, jc.ErrorIsNil) 81 82 s.registry.providers["someprovider"] = &mockModelConfigUpgrader{ 83 upgradeConfig: func(cfg *config.Config) (*config.Config, error) { 84 return cfg.Remove([]string{"test-key"}) 85 }, 86 } 87 err = upgrades.UpgradeModelConfig(s.reader, s.updater, s.registry) 88 c.Assert(err, jc.ErrorIsNil) 89 90 s.stub.CheckCallNames(c, "ModelConfig", "UpdateModelConfig") 91 updateCall := s.stub.Calls()[1] 92 expectedAttrs := s.cfg.AllAttrs() 93 delete(expectedAttrs, "test-key") 94 c.Assert(updateCall.Args, gc.HasLen, 3) 95 c.Assert(updateCall.Args[0], jc.DeepEquals, expectedAttrs) 96 c.Assert(updateCall.Args[1], jc.SameContents, []string{"test-key"}) 97 c.Assert(updateCall.Args[2], gc.IsNil) 98 } 99 100 func (s *upgradeModelConfigSuite) TestUpgradeModelConfigUpgradeConfigError(c *gc.C) { 101 s.registry.providers["someprovider"] = &mockModelConfigUpgrader{ 102 upgradeConfig: func(cfg *config.Config) (*config.Config, error) { 103 return nil, errors.New("cannot upgrade config") 104 }, 105 } 106 err := upgrades.UpgradeModelConfig(s.reader, s.updater, s.registry) 107 c.Assert(err, gc.ErrorMatches, "upgrading config: cannot upgrade config") 108 s.stub.CheckCallNames(c, "ModelConfig") 109 } 110 111 func (s *upgradeModelConfigSuite) TestUpgradeModelConfigUpdateConfigError(c *gc.C) { 112 s.stub.SetErrors(nil, errors.New("cannot update environ config")) 113 s.registry.providers["someprovider"] = &mockModelConfigUpgrader{ 114 upgradeConfig: func(cfg *config.Config) (*config.Config, error) { 115 return cfg, nil 116 }, 117 } 118 err := upgrades.UpgradeModelConfig(s.reader, s.updater, s.registry) 119 c.Assert(err, gc.ErrorMatches, "updating config in state: cannot update environ config") 120 121 s.stub.CheckCallNames(c, "ModelConfig", "UpdateModelConfig") 122 updateCall := s.stub.Calls()[1] 123 c.Assert(updateCall.Args, gc.HasLen, 3) 124 c.Assert(updateCall.Args[0], jc.DeepEquals, s.cfg.AllAttrs()) 125 c.Assert(updateCall.Args[1], gc.IsNil) 126 c.Assert(updateCall.Args[2], gc.IsNil) 127 } 128 129 type environConfigFunc func() (*config.Config, error) 130 131 func (f environConfigFunc) ModelConfig() (*config.Config, error) { 132 return f() 133 } 134 135 type updateModelConfigFunc func(map[string]interface{}, []string, state.ValidateConfigFunc) error 136 137 func (f updateModelConfigFunc) UpdateModelConfig( 138 update map[string]interface{}, remove []string, validate state.ValidateConfigFunc, 139 ) error { 140 return f(update, remove, validate) 141 } 142 143 type mockProviderRegistry struct { 144 environs.ProviderRegistry 145 testing.Stub 146 providers map[string]environs.EnvironProvider 147 } 148 149 func (r *mockProviderRegistry) Provider(name string) (environs.EnvironProvider, error) { 150 r.MethodCall(r, "Provider", name) 151 return r.providers[name], r.NextErr() 152 } 153 154 type mockEnvironProvider struct { 155 testing.Stub 156 environs.EnvironProvider 157 } 158 159 type mockModelConfigUpgrader struct { 160 mockEnvironProvider 161 upgradeConfig func(*config.Config) (*config.Config, error) 162 } 163 164 func (u *mockModelConfigUpgrader) UpgradeConfig(cfg *config.Config) (*config.Config, error) { 165 u.MethodCall(u, "UpgradeConfig", cfg) 166 return u.upgradeConfig(cfg) 167 }