launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/provider/joyent/config_test.go (about) 1 // Copyright 2013 Joyent Inc. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package joyent_test 5 6 import ( 7 gc "launchpad.net/gocheck" 8 9 "launchpad.net/juju-core/environs" 10 "launchpad.net/juju-core/environs/config" 11 "launchpad.net/juju-core/provider/joyent" 12 "launchpad.net/juju-core/testing" 13 "launchpad.net/juju-core/testing/testbase" 14 ) 15 16 func newConfig(c *gc.C, attrs testing.Attrs) *config.Config { 17 attrs = testing.FakeConfig().Merge(attrs) 18 cfg, err := config.New(config.NoDefaults, attrs) 19 c.Assert(err, gc.IsNil) 20 return cfg 21 } 22 23 func validAttrs() testing.Attrs { 24 return testing.FakeConfig().Merge(testing.Attrs{ 25 "type": "joyent", 26 "sdc-user": "dstroppa", 27 "sdc-key-id": "12:c3:a7:cb:a2:29:e2:90:88:3f:04:53:3b:4e:75:40", 28 "sdc-region": "us-west-1", 29 "manta-user": "dstroppa", 30 "manta-key-id": "12:c3:a7:cb:a2:29:e2:90:88:3f:04:53:3b:4e:75:40", 31 "manta-region": "us-east", 32 "control-dir": "juju-test", 33 }) 34 } 35 36 type ConfigSuite struct { 37 testbase.LoggingSuite 38 originalValues map[string]testbase.Restorer 39 } 40 41 var _ = gc.Suite(&ConfigSuite{}) 42 43 func (s *ConfigSuite) SetUpSuite(c *gc.C) { 44 s.PatchEnvironment(joyent.SdcAccount, "tester") 45 s.PatchEnvironment(joyent.SdcKeyId, "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a") 46 s.PatchEnvironment(joyent.MantaUser, "tester") 47 s.PatchEnvironment(joyent.MantaKeyId, "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a") 48 } 49 50 var newConfigTests = []struct { 51 info string 52 insert testing.Attrs 53 remove []string 54 expect testing.Attrs 55 err string 56 }{{ 57 info: "sdc-user is required", 58 remove: []string{"sdc-user"}, 59 err: "sdc-user: expected string, got nothing", 60 }, { 61 info: "sdc-user cannot be empty", 62 insert: testing.Attrs{"sdc-user": ""}, 63 err: "sdc-user: must not be empty", 64 }, { 65 info: "sdc-key-id is required", 66 remove: []string{"sdc-key-id"}, 67 err: "sdc-key-id: expected string, got nothing", 68 }, { 69 info: "sdc-key-id cannot be empty", 70 insert: testing.Attrs{"sdc-key-id": ""}, 71 err: "sdc-key-id: must not be empty", 72 }, { 73 info: "sdc-region is inserted if missing", 74 expect: testing.Attrs{"sdc-region": "us-west-1"}, 75 }, { 76 info: "sdc-region cannot be empty", 77 insert: testing.Attrs{"sdc-region": ""}, 78 err: "sdc-region: must not be empty", 79 }, { 80 info: "sdc-region is untouched if present", 81 insert: testing.Attrs{"sdc-region": "us-west-1"}, 82 expect: testing.Attrs{"sdc-region": "us-west-1"}, 83 }, { 84 info: "manta-user is required", 85 remove: []string{"manta-user"}, 86 err: "manta-user: expected string, got nothing", 87 }, { 88 info: "manta-user cannot be empty", 89 insert: testing.Attrs{"manta-user": ""}, 90 err: "manta-user: must not be empty", 91 }, { 92 info: "manta-key-id is required", 93 remove: []string{"manta-key-id"}, 94 err: "manta-key-id: expected string, got nothing", 95 }, { 96 info: "manta-key-id cannot be empty", 97 insert: testing.Attrs{"manta-key-id": ""}, 98 err: "manta-key-id: must not be empty", 99 }, { 100 info: "manta-region is inserted if missing", 101 expect: testing.Attrs{"manta-region": "us-east"}, 102 }, { 103 info: "manta-region cannot be empty", 104 insert: testing.Attrs{"manta-region": ""}, 105 err: "manta-region: must not be empty", 106 }, { 107 info: "manta-region is untouched if present", 108 insert: testing.Attrs{"manta-region": "us-east"}, 109 expect: testing.Attrs{"manta-region": "us-east"}, 110 }, { 111 info: "unknown field is not touched", 112 insert: testing.Attrs{"unknown-field": 12345}, 113 expect: testing.Attrs{"unknown-field": 12345}, 114 }} 115 116 func (*ConfigSuite) TestNewEnvironConfig(c *gc.C) { 117 for i, test := range newConfigTests { 118 c.Logf("test %d: %s", i, test.info) 119 attrs := validAttrs().Merge(test.insert).Delete(test.remove...) 120 testConfig := newConfig(c, attrs) 121 environ, err := environs.New(testConfig) 122 if test.err == "" { 123 c.Assert(err, gc.IsNil) 124 attrs := environ.Config().AllAttrs() 125 for field, value := range test.expect { 126 c.Check(attrs[field], gc.Equals, value) 127 } 128 } else { 129 c.Assert(environ, gc.IsNil) 130 c.Check(err, gc.ErrorMatches, test.err) 131 } 132 } 133 } 134 135 func (*ConfigSuite) TestValidateNewConfig(c *gc.C) { 136 for i, test := range newConfigTests { 137 c.Logf("test %d: %s", i, test.info) 138 attrs := validAttrs().Merge(test.insert).Delete(test.remove...) 139 testConfig := newConfig(c, attrs) 140 validatedConfig, err := joyent.Provider.Validate(testConfig, nil) 141 if test.err == "" { 142 c.Assert(err, gc.IsNil) 143 attrs := validatedConfig.AllAttrs() 144 for field, value := range test.expect { 145 c.Check(attrs[field], gc.Equals, value) 146 } 147 } else { 148 c.Assert(validatedConfig, gc.IsNil) 149 c.Check(err, gc.ErrorMatches, "invalid Joyent provider config: "+test.err) 150 } 151 } 152 } 153 154 func (*ConfigSuite) TestValidateOldConfig(c *gc.C) { 155 knownGoodConfig := newConfig(c, validAttrs()) 156 for i, test := range newConfigTests { 157 c.Logf("test %d: %s", i, test.info) 158 attrs := validAttrs().Merge(test.insert).Delete(test.remove...) 159 testConfig := newConfig(c, attrs) 160 validatedConfig, err := joyent.Provider.Validate(knownGoodConfig, testConfig) 161 if test.err == "" { 162 c.Assert(err, gc.IsNil) 163 attrs := validatedConfig.AllAttrs() 164 for field, value := range validAttrs() { 165 c.Check(attrs[field], gc.Equals, value) 166 } 167 } else { 168 c.Assert(validatedConfig, gc.IsNil) 169 c.Check(err, gc.ErrorMatches, "original Joyent provider config is invalid: "+test.err) 170 } 171 } 172 } 173 174 var changeConfigTests = []struct { 175 info string 176 insert testing.Attrs 177 remove []string 178 expect testing.Attrs 179 err string 180 }{{ 181 info: "no change, no error", 182 expect: validAttrs(), 183 }, { 184 info: "can change sdc-user", 185 insert: testing.Attrs{"sdc-user": "joyent_user"}, 186 expect: testing.Attrs{"sdc-user": "joyent_user"}, 187 }, { 188 info: "can change sdc-key-id", 189 insert: testing.Attrs{"sdc-key-id": "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a"}, 190 expect: testing.Attrs{"sdc-key-id": "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a"}, 191 }, { 192 info: "can change sdc-region", 193 insert: testing.Attrs{"sdc-region": "us-west-1"}, 194 expect: testing.Attrs{"sdc-region": "us-west-1"}, 195 }, { 196 info: "can change manta-user", 197 insert: testing.Attrs{"manta-user": "manta_user"}, 198 expect: testing.Attrs{"manta-user": "manta_user"}, 199 }, { 200 info: "can change manta-key-id", 201 insert: testing.Attrs{"manta-key-id": "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a"}, 202 expect: testing.Attrs{"manta-key-id": "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a"}, 203 }, { 204 info: "can change manta-region", 205 insert: testing.Attrs{"manta-region": "us-east"}, 206 expect: testing.Attrs{"manta-region": "us-east"}, 207 }, { 208 info: "can insert unknown field", 209 insert: testing.Attrs{"unknown": "ignoti"}, 210 expect: testing.Attrs{"unknown": "ignoti"}, 211 }} 212 213 func (s *ConfigSuite) TestValidateChange(c *gc.C) { 214 baseConfig := newConfig(c, validAttrs()) 215 for i, test := range changeConfigTests { 216 c.Logf("test %d: %s", i, test.info) 217 attrs := validAttrs().Merge(test.insert).Delete(test.remove...) 218 testConfig := newConfig(c, attrs) 219 validatedConfig, err := joyent.Provider.Validate(testConfig, baseConfig) 220 if test.err == "" { 221 c.Assert(err, gc.IsNil) 222 attrs := validatedConfig.AllAttrs() 223 for field, value := range test.expect { 224 c.Check(attrs[field], gc.Equals, value) 225 } 226 } else { 227 c.Assert(validatedConfig, gc.IsNil) 228 c.Check(err, gc.ErrorMatches, "invalid config change: "+test.err) 229 } 230 } 231 } 232 233 func (s *ConfigSuite) TestSetConfig(c *gc.C) { 234 baseConfig := newConfig(c, validAttrs()) 235 for i, test := range changeConfigTests { 236 c.Logf("test %d: %s", i, test.info) 237 environ, err := environs.New(baseConfig) 238 c.Assert(err, gc.IsNil) 239 attrs := validAttrs().Merge(test.insert).Delete(test.remove...) 240 testConfig := newConfig(c, attrs) 241 err = environ.SetConfig(testConfig) 242 newAttrs := environ.Config().AllAttrs() 243 if test.err == "" { 244 c.Assert(err, gc.IsNil) 245 for field, value := range test.expect { 246 c.Check(newAttrs[field], gc.Equals, value) 247 } 248 } else { 249 c.Check(err, gc.ErrorMatches, test.err) 250 for field, value := range baseConfig.UnknownAttrs() { 251 c.Check(newAttrs[field], gc.Equals, value) 252 } 253 } 254 } 255 } 256 257 var prepareConfigTests = []struct { 258 info string 259 insert testing.Attrs 260 remove []string 261 expect testing.Attrs 262 err string 263 }{{ 264 info: "All value provided, nothig to do", 265 expect: validAttrs(), 266 }, { 267 info: "can get sdc-user from env variable", 268 insert: testing.Attrs{"sdc-user": ""}, 269 expect: testing.Attrs{"sdc-user": "tester"}, 270 }, { 271 info: "can get sdc-key-id from env variable", 272 insert: testing.Attrs{"sdc-key-id": ""}, 273 expect: testing.Attrs{"sdc-key-id": "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a"}, 274 }, { 275 info: "can get manta-user from env variable", 276 insert: testing.Attrs{"manta-user": ""}, 277 expect: testing.Attrs{"manta-user": "tester"}, 278 }, { 279 info: "can get manta-key-id from env variable", 280 insert: testing.Attrs{"manta-key-id": ""}, 281 expect: testing.Attrs{"manta-key-id": "11:c4:b6:c0:a3:24:22:96:a8:1f:07:53:3f:8e:14:7a"}, 282 }} 283 284 func (s *ConfigSuite) TestPrepare(c *gc.C) { 285 for i, test := range prepareConfigTests { 286 c.Logf("test %d: %s", i, test.info) 287 attrs := validAttrs().Merge(test.insert).Delete(test.remove...) 288 testConfig := newConfig(c, attrs) 289 preparedConfig, err := joyent.Provider.Prepare(testConfig) 290 if test.err == "" { 291 c.Assert(err, gc.IsNil) 292 attrs := preparedConfig.Config().AllAttrs() 293 for field, value := range test.expect { 294 c.Check(attrs[field], gc.Equals, value) 295 } 296 } else { 297 c.Assert(preparedConfig, gc.IsNil) 298 c.Check(err, gc.ErrorMatches, "invalid prepare config: "+test.err) 299 } 300 } 301 }