github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/testing/factory/factory_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package factory_test 5 6 import ( 7 "fmt" 8 "regexp" 9 "time" 10 11 "github.com/juju/errors" 12 "github.com/juju/names" 13 jc "github.com/juju/testing/checkers" 14 "github.com/juju/utils" 15 gc "gopkg.in/check.v1" 16 "gopkg.in/juju/charm.v4" 17 18 "github.com/juju/juju/instance" 19 "github.com/juju/juju/state" 20 statetesting "github.com/juju/juju/state/testing" 21 "github.com/juju/juju/testing" 22 "github.com/juju/juju/testing/factory" 23 ) 24 25 type factorySuite struct { 26 statetesting.StateSuite 27 Factory *factory.Factory 28 } 29 30 var _ = gc.Suite(&factorySuite{}) 31 32 func (s *factorySuite) SetUpTest(c *gc.C) { 33 s.Policy = new(statetesting.MockPolicy) 34 s.StateSuite.SetUpTest(c) 35 s.Factory = factory.NewFactory(s.State) 36 } 37 38 func (s *factorySuite) TestMakeUserNil(c *gc.C) { 39 user := s.Factory.MakeUser(c, nil) 40 c.Assert(user.IsDisabled(), jc.IsFalse) 41 42 saved, err := s.State.User(user.UserTag()) 43 c.Assert(err, jc.ErrorIsNil) 44 c.Assert(saved.Tag(), gc.Equals, user.Tag()) 45 c.Assert(saved.Name(), gc.Equals, user.Name()) 46 c.Assert(saved.DisplayName(), gc.Equals, user.DisplayName()) 47 c.Assert(saved.CreatedBy(), gc.Equals, user.CreatedBy()) 48 c.Assert(saved.DateCreated(), gc.Equals, user.DateCreated()) 49 c.Assert(saved.LastLogin(), gc.Equals, user.LastLogin()) 50 c.Assert(saved.IsDisabled(), gc.Equals, user.IsDisabled()) 51 } 52 53 func (s *factorySuite) TestMakeUserParams(c *gc.C) { 54 username := "bob" 55 displayName := "Bob the Builder" 56 creator := s.Factory.MakeUser(c, nil) 57 password := "sekrit" 58 user := s.Factory.MakeUser(c, &factory.UserParams{ 59 Name: username, 60 DisplayName: displayName, 61 Creator: creator.Tag(), 62 Password: password, 63 }) 64 c.Assert(user.IsDisabled(), jc.IsFalse) 65 c.Assert(user.Name(), gc.Equals, username) 66 c.Assert(user.DisplayName(), gc.Equals, displayName) 67 c.Assert(user.CreatedBy(), gc.Equals, creator.UserTag().Name()) 68 c.Assert(user.PasswordValid(password), jc.IsTrue) 69 70 saved, err := s.State.User(user.UserTag()) 71 c.Assert(err, jc.ErrorIsNil) 72 c.Assert(saved.Tag(), gc.Equals, user.Tag()) 73 c.Assert(saved.Name(), gc.Equals, user.Name()) 74 c.Assert(saved.DisplayName(), gc.Equals, user.DisplayName()) 75 c.Assert(saved.CreatedBy(), gc.Equals, user.CreatedBy()) 76 c.Assert(saved.DateCreated(), gc.Equals, user.DateCreated()) 77 c.Assert(saved.LastLogin(), gc.Equals, user.LastLogin()) 78 c.Assert(saved.IsDisabled(), gc.Equals, user.IsDisabled()) 79 80 _, err = s.State.EnvironmentUser(user.UserTag()) 81 c.Assert(err, jc.ErrorIsNil) 82 } 83 84 func (s *factorySuite) TestMakeUserInvalidCreator(c *gc.C) { 85 invalidFunc := func() { 86 s.Factory.MakeUser(c, &factory.UserParams{ 87 Name: "bob", 88 DisplayName: "Bob", 89 Creator: names.NewMachineTag("0"), 90 Password: "bob", 91 }) 92 } 93 94 c.Assert(invalidFunc, gc.PanicMatches, `interface conversion: .*`) 95 saved, err := s.State.User(names.NewUserTag("bob")) 96 c.Assert(err, jc.Satisfies, errors.IsNotFound) 97 c.Assert(saved, gc.IsNil) 98 } 99 100 func (s *factorySuite) TestMakeUserNoEnvUser(c *gc.C) { 101 username := "bob" 102 displayName := "Bob the Builder" 103 creator := names.NewLocalUserTag("eric") 104 password := "sekrit" 105 user := s.Factory.MakeUser(c, &factory.UserParams{ 106 Name: username, 107 DisplayName: displayName, 108 Creator: creator, 109 Password: password, 110 NoEnvUser: true, 111 }) 112 113 _, err := s.State.User(user.UserTag()) 114 c.Assert(err, jc.ErrorIsNil) 115 _, err = s.State.EnvironmentUser(user.UserTag()) 116 c.Assert(err, jc.Satisfies, errors.IsNotFound) 117 } 118 119 func (s *factorySuite) TestMakeEnvUserNil(c *gc.C) { 120 envUser := s.Factory.MakeEnvUser(c, nil) 121 saved, err := s.State.EnvironmentUser(envUser.UserTag()) 122 c.Assert(err, jc.ErrorIsNil) 123 c.Assert(saved.EnvironmentTag().Id(), gc.Equals, envUser.EnvironmentTag().Id()) 124 c.Assert(saved.UserName(), gc.Equals, envUser.UserName()) 125 c.Assert(saved.DisplayName(), gc.Equals, envUser.DisplayName()) 126 c.Assert(saved.CreatedBy(), gc.Equals, envUser.CreatedBy()) 127 } 128 129 func (s *factorySuite) TestMakeEnvUserPartialParams(c *gc.C) { 130 s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar123", NoEnvUser: true}) 131 envUser := s.Factory.MakeEnvUser(c, &factory.EnvUserParams{ 132 User: "foobar123"}) 133 134 saved, err := s.State.EnvironmentUser(envUser.UserTag()) 135 c.Assert(err, jc.ErrorIsNil) 136 c.Assert(saved.EnvironmentTag().Id(), gc.Equals, envUser.EnvironmentTag().Id()) 137 c.Assert(saved.UserName(), gc.Equals, "foobar123@local") 138 c.Assert(saved.DisplayName(), gc.Equals, envUser.DisplayName()) 139 c.Assert(saved.CreatedBy(), gc.Equals, envUser.CreatedBy()) 140 } 141 142 func (s *factorySuite) TestMakeEnvUserParams(c *gc.C) { 143 s.Factory.MakeUser(c, &factory.UserParams{Name: "createdby"}) 144 s.Factory.MakeUser(c, &factory.UserParams{ 145 Name: "foobar", 146 Creator: names.NewUserTag("createdby"), 147 NoEnvUser: true, 148 }) 149 envUser := s.Factory.MakeEnvUser(c, &factory.EnvUserParams{ 150 User: "foobar", 151 CreatedBy: names.NewUserTag("createdby"), 152 }) 153 154 saved, err := s.State.EnvironmentUser(envUser.UserTag()) 155 c.Assert(err, jc.ErrorIsNil) 156 c.Assert(saved.EnvironmentTag().Id(), gc.Equals, envUser.EnvironmentTag().Id()) 157 c.Assert(saved.UserName(), gc.Equals, "foobar@local") 158 c.Assert(saved.CreatedBy(), gc.Equals, "createdby@local") 159 } 160 161 func (s *factorySuite) TestMakeEnvUserInvalidCreatedBy(c *gc.C) { 162 invalidFunc := func() { 163 s.Factory.MakeEnvUser(c, &factory.EnvUserParams{ 164 User: "bob", 165 CreatedBy: names.NewMachineTag("0"), 166 }) 167 } 168 169 c.Assert(invalidFunc, gc.PanicMatches, `interface conversion: .*`) 170 saved, err := s.State.EnvironmentUser(names.NewLocalUserTag("bob")) 171 c.Assert(err, jc.Satisfies, errors.IsNotFound) 172 c.Assert(saved, gc.IsNil) 173 } 174 175 func (s *factorySuite) TestMakeEnvUserNonLocalUser(c *gc.C) { 176 creator := s.Factory.MakeUser(c, &factory.UserParams{Name: "created-by"}) 177 envUser := s.Factory.MakeEnvUser(c, &factory.EnvUserParams{ 178 User: "foobar@ubuntuone", 179 CreatedBy: creator.UserTag(), 180 }) 181 182 saved, err := s.State.EnvironmentUser(envUser.UserTag()) 183 c.Assert(err, jc.ErrorIsNil) 184 c.Assert(saved.EnvironmentTag().Id(), gc.Equals, envUser.EnvironmentTag().Id()) 185 c.Assert(saved.UserName(), gc.Equals, "foobar@ubuntuone") 186 c.Assert(saved.CreatedBy(), gc.Equals, creator.UserTag().Username()) 187 } 188 189 func (s *factorySuite) TestMakeMachineNil(c *gc.C) { 190 machine, password := s.Factory.MakeMachineReturningPassword(c, nil) 191 c.Assert(machine, gc.NotNil) 192 193 saved, err := s.State.Machine(machine.Id()) 194 c.Assert(err, jc.ErrorIsNil) 195 196 c.Assert(saved.Series(), gc.Equals, machine.Series()) 197 c.Assert(saved.Id(), gc.Equals, machine.Id()) 198 c.Assert(saved.Series(), gc.Equals, machine.Series()) 199 c.Assert(saved.Tag(), gc.Equals, machine.Tag()) 200 c.Assert(saved.Life(), gc.Equals, machine.Life()) 201 c.Assert(saved.Jobs(), gc.DeepEquals, machine.Jobs()) 202 c.Assert(saved.PasswordValid(password), jc.IsTrue) 203 savedInstanceId, err := saved.InstanceId() 204 c.Assert(err, jc.ErrorIsNil) 205 machineInstanceId, err := machine.InstanceId() 206 c.Assert(err, jc.ErrorIsNil) 207 c.Assert(savedInstanceId, gc.Equals, machineInstanceId) 208 c.Assert(saved.Clean(), gc.Equals, machine.Clean()) 209 } 210 211 func (s *factorySuite) TestMakeMachine(c *gc.C) { 212 series := "quantal" 213 jobs := []state.MachineJob{state.JobManageEnviron} 214 password, err := utils.RandomPassword() 215 c.Assert(err, jc.ErrorIsNil) 216 nonce := "some-nonce" 217 id := instance.Id("some-id") 218 219 machine, pwd := s.Factory.MakeMachineReturningPassword(c, &factory.MachineParams{ 220 Series: series, 221 Jobs: jobs, 222 Password: password, 223 Nonce: nonce, 224 InstanceId: id, 225 }) 226 c.Assert(machine, gc.NotNil) 227 c.Assert(pwd, gc.Equals, password) 228 229 c.Assert(machine.Series(), gc.Equals, series) 230 c.Assert(machine.Jobs(), gc.DeepEquals, jobs) 231 machineInstanceId, err := machine.InstanceId() 232 c.Assert(err, jc.ErrorIsNil) 233 c.Assert(machineInstanceId, gc.Equals, id) 234 c.Assert(machine.CheckProvisioned(nonce), jc.IsTrue) 235 c.Assert(machine.PasswordValid(password), jc.IsTrue) 236 237 saved, err := s.State.Machine(machine.Id()) 238 c.Assert(err, jc.ErrorIsNil) 239 240 c.Assert(saved.Id(), gc.Equals, machine.Id()) 241 c.Assert(saved.Series(), gc.Equals, machine.Series()) 242 c.Assert(saved.Tag(), gc.Equals, machine.Tag()) 243 c.Assert(saved.Life(), gc.Equals, machine.Life()) 244 c.Assert(saved.Jobs(), gc.DeepEquals, machine.Jobs()) 245 savedInstanceId, err := saved.InstanceId() 246 c.Assert(err, jc.ErrorIsNil) 247 c.Assert(savedInstanceId, gc.Equals, machineInstanceId) 248 c.Assert(saved.Clean(), gc.Equals, machine.Clean()) 249 } 250 251 func (s *factorySuite) TestMakeCharmNil(c *gc.C) { 252 charm := s.Factory.MakeCharm(c, nil) 253 c.Assert(charm, gc.NotNil) 254 255 saved, err := s.State.Charm(charm.URL()) 256 c.Assert(err, jc.ErrorIsNil) 257 258 c.Assert(saved.URL(), gc.DeepEquals, charm.URL()) 259 c.Assert(saved.Meta(), gc.DeepEquals, charm.Meta()) 260 c.Assert(saved.StoragePath(), gc.Equals, charm.StoragePath()) 261 c.Assert(saved.BundleSha256(), gc.Equals, charm.BundleSha256()) 262 } 263 264 func (s *factorySuite) TestMakeCharm(c *gc.C) { 265 series := "quantal" 266 name := "wordpress" 267 revision := 13 268 url := fmt.Sprintf("cs:%s/%s-%d", series, name, revision) 269 ch := s.Factory.MakeCharm(c, &factory.CharmParams{ 270 Name: name, 271 URL: url, 272 }) 273 c.Assert(ch, gc.NotNil) 274 275 c.Assert(ch.URL(), gc.DeepEquals, charm.MustParseURL(url)) 276 277 saved, err := s.State.Charm(ch.URL()) 278 c.Assert(err, jc.ErrorIsNil) 279 280 c.Assert(saved.URL(), gc.DeepEquals, ch.URL()) 281 c.Assert(saved.Meta(), gc.DeepEquals, ch.Meta()) 282 c.Assert(saved.Meta().Name, gc.Equals, name) 283 c.Assert(saved.StoragePath(), gc.Equals, ch.StoragePath()) 284 c.Assert(saved.BundleSha256(), gc.Equals, ch.BundleSha256()) 285 } 286 287 func (s *factorySuite) TestMakeServiceNil(c *gc.C) { 288 service := s.Factory.MakeService(c, nil) 289 c.Assert(service, gc.NotNil) 290 291 saved, err := s.State.Service(service.Name()) 292 c.Assert(err, jc.ErrorIsNil) 293 294 c.Assert(saved.Name(), gc.Equals, service.Name()) 295 c.Assert(saved.Tag(), gc.Equals, service.Tag()) 296 c.Assert(saved.Life(), gc.Equals, service.Life()) 297 } 298 299 func (s *factorySuite) TestMakeService(c *gc.C) { 300 charm := s.Factory.MakeCharm(c, &factory.CharmParams{Name: "wordpress"}) 301 creator := s.Factory.MakeUser(c, &factory.UserParams{Name: "bill"}).Tag() 302 service := s.Factory.MakeService(c, &factory.ServiceParams{ 303 Charm: charm, 304 Creator: creator, 305 }) 306 c.Assert(service, gc.NotNil) 307 308 c.Assert(service.Name(), gc.Equals, "wordpress") 309 c.Assert(service.GetOwnerTag(), gc.Equals, creator.String()) 310 curl, _ := service.CharmURL() 311 c.Assert(curl, gc.DeepEquals, charm.URL()) 312 313 saved, err := s.State.Service(service.Name()) 314 c.Assert(err, jc.ErrorIsNil) 315 316 c.Assert(saved.Name(), gc.Equals, service.Name()) 317 c.Assert(saved.Tag(), gc.Equals, service.Tag()) 318 c.Assert(saved.Life(), gc.Equals, service.Life()) 319 } 320 321 func (s *factorySuite) TestMakeServiceInvalidCreator(c *gc.C) { 322 serviceName := "mysql" 323 invalidFunc := func() { 324 s.Factory.MakeService(c, &factory.ServiceParams{ 325 Name: serviceName, 326 Creator: names.NewMachineTag("0"), 327 }) 328 } 329 c.Assert(invalidFunc, gc.PanicMatches, `interface conversion: .*`) 330 saved, err := s.State.Service(serviceName) 331 c.Assert(err, jc.Satisfies, errors.IsNotFound) 332 c.Assert(saved, gc.IsNil) 333 } 334 335 func (s *factorySuite) TestMakeUnitNil(c *gc.C) { 336 unit := s.Factory.MakeUnit(c, nil) 337 c.Assert(unit, gc.NotNil) 338 339 saved, err := s.State.Unit(unit.Name()) 340 c.Assert(err, jc.ErrorIsNil) 341 342 c.Assert(saved.Name(), gc.Equals, unit.Name()) 343 c.Assert(saved.ServiceName(), gc.Equals, unit.ServiceName()) 344 c.Assert(saved.Series(), gc.Equals, unit.Series()) 345 c.Assert(saved.Life(), gc.Equals, unit.Life()) 346 } 347 348 func (s *factorySuite) TestMakeUnit(c *gc.C) { 349 service := s.Factory.MakeService(c, nil) 350 unit := s.Factory.MakeUnit(c, &factory.UnitParams{ 351 Service: service, 352 SetCharmURL: true, 353 }) 354 c.Assert(unit, gc.NotNil) 355 356 c.Assert(unit.ServiceName(), gc.Equals, service.Name()) 357 358 saved, err := s.State.Unit(unit.Name()) 359 c.Assert(err, jc.ErrorIsNil) 360 361 c.Assert(saved.Name(), gc.Equals, unit.Name()) 362 c.Assert(saved.ServiceName(), gc.Equals, unit.ServiceName()) 363 c.Assert(saved.Series(), gc.Equals, unit.Series()) 364 c.Assert(saved.Life(), gc.Equals, unit.Life()) 365 366 serviceCharmURL, _ := service.CharmURL() 367 unitCharmURL, _ := saved.CharmURL() 368 c.Assert(unitCharmURL, gc.DeepEquals, serviceCharmURL) 369 } 370 371 func (s *factorySuite) TestMakeRelationNil(c *gc.C) { 372 relation := s.Factory.MakeRelation(c, nil) 373 c.Assert(relation, gc.NotNil) 374 375 saved, err := s.State.Relation(relation.Id()) 376 c.Assert(err, jc.ErrorIsNil) 377 378 c.Assert(saved.Id(), gc.Equals, relation.Id()) 379 c.Assert(saved.Tag(), gc.Equals, relation.Tag()) 380 c.Assert(saved.Life(), gc.Equals, relation.Life()) 381 c.Assert(saved.Endpoints(), gc.DeepEquals, relation.Endpoints()) 382 } 383 384 func (s *factorySuite) TestMakeRelation(c *gc.C) { 385 s1 := s.Factory.MakeService(c, &factory.ServiceParams{ 386 Name: "service1", 387 Charm: s.Factory.MakeCharm(c, &factory.CharmParams{ 388 Name: "wordpress", 389 }), 390 }) 391 e1, err := s1.Endpoint("db") 392 c.Assert(err, jc.ErrorIsNil) 393 394 s2 := s.Factory.MakeService(c, &factory.ServiceParams{ 395 Name: "service2", 396 Charm: s.Factory.MakeCharm(c, &factory.CharmParams{ 397 Name: "mysql", 398 }), 399 }) 400 e2, err := s2.Endpoint("server") 401 c.Assert(err, jc.ErrorIsNil) 402 403 relation := s.Factory.MakeRelation(c, &factory.RelationParams{ 404 Endpoints: []state.Endpoint{e1, e2}, 405 }) 406 c.Assert(relation, gc.NotNil) 407 408 saved, err := s.State.Relation(relation.Id()) 409 c.Assert(err, jc.ErrorIsNil) 410 411 c.Assert(saved.Id(), gc.Equals, relation.Id()) 412 c.Assert(saved.Tag(), gc.Equals, relation.Tag()) 413 c.Assert(saved.Life(), gc.Equals, relation.Life()) 414 c.Assert(saved.Endpoints(), gc.DeepEquals, relation.Endpoints()) 415 } 416 417 func (s *factorySuite) TestMakeMetricNil(c *gc.C) { 418 metric := s.Factory.MakeMetric(c, nil) 419 c.Assert(metric, gc.NotNil) 420 421 saved, err := s.State.MetricBatch(metric.UUID()) 422 c.Assert(err, jc.ErrorIsNil) 423 424 c.Assert(saved.UUID(), gc.Equals, metric.UUID()) 425 c.Assert(saved.Unit(), gc.Equals, metric.Unit()) 426 c.Assert(saved.Sent(), gc.Equals, metric.Sent()) 427 c.Assert(saved.CharmURL(), gc.Equals, metric.CharmURL()) 428 c.Assert(saved.Sent(), gc.Equals, metric.Sent()) 429 c.Assert(saved.Metrics(), gc.HasLen, 1) 430 c.Assert(saved.Metrics()[0].Key, gc.Equals, metric.Metrics()[0].Key) 431 c.Assert(saved.Metrics()[0].Value, gc.Equals, metric.Metrics()[0].Value) 432 c.Assert(saved.Metrics()[0].Time.Equal(metric.Metrics()[0].Time), jc.IsTrue) 433 } 434 435 func (s *factorySuite) TestMakeMetric(c *gc.C) { 436 now := time.Now().Round(time.Second).UTC() 437 meteredCharm := s.Factory.MakeCharm(c, &factory.CharmParams{Name: "metered", URL: "cs:quantal/metered"}) 438 meteredService := s.Factory.MakeService(c, &factory.ServiceParams{Charm: meteredCharm}) 439 unit := s.Factory.MakeUnit(c, &factory.UnitParams{Service: meteredService, SetCharmURL: true}) 440 metric := s.Factory.MakeMetric(c, &factory.MetricParams{ 441 Unit: unit, 442 Time: &now, 443 Sent: true, 444 Metrics: []state.Metric{{"pings", "1", now}}, 445 }) 446 c.Assert(metric, gc.NotNil) 447 448 saved, err := s.State.MetricBatch(metric.UUID()) 449 c.Assert(err, jc.ErrorIsNil) 450 451 c.Assert(saved.UUID(), gc.Equals, metric.UUID()) 452 c.Assert(saved.Unit(), gc.Equals, metric.Unit()) 453 c.Assert(saved.CharmURL(), gc.Equals, metric.CharmURL()) 454 c.Assert(metric.Sent(), jc.IsTrue) 455 c.Assert(saved.Sent(), jc.IsTrue) 456 c.Assert(saved.Metrics(), gc.HasLen, 1) 457 c.Assert(saved.Metrics()[0].Key, gc.Equals, "pings") 458 c.Assert(saved.Metrics()[0].Value, gc.Equals, "1") 459 c.Assert(saved.Metrics()[0].Time.Equal(now), jc.IsTrue) 460 } 461 462 func (s *factorySuite) TestMakeEnvironmentNil(c *gc.C) { 463 st := s.Factory.MakeEnvironment(c, nil) 464 defer st.Close() 465 466 env, err := st.Environment() 467 c.Assert(err, jc.ErrorIsNil) 468 re := regexp.MustCompile(`^testenv-\d+$`) 469 c.Assert(re.MatchString(env.Name()), jc.IsTrue) 470 c.Assert(env.UUID() == s.State.EnvironUUID(), jc.IsFalse) 471 origEnv, err := s.State.Environment() 472 c.Assert(err, jc.ErrorIsNil) 473 c.Assert(env.Owner(), gc.Equals, origEnv.Owner()) 474 475 cfg, err := st.EnvironConfig() 476 c.Assert(err, jc.ErrorIsNil) 477 c.Assert(cfg.AllAttrs()["default-series"], gc.Equals, "trusty") 478 } 479 480 func (s *factorySuite) TestMakeEnvironment(c *gc.C) { 481 owner := s.Factory.MakeUser(c, &factory.UserParams{ 482 Name: "owner", 483 }) 484 params := &factory.EnvParams{ 485 Name: "foo", 486 Owner: owner.UserTag(), 487 ConfigAttrs: testing.Attrs{"default-series": "precise"}, 488 } 489 490 st := s.Factory.MakeEnvironment(c, params) 491 defer st.Close() 492 493 env, err := st.Environment() 494 c.Assert(err, jc.ErrorIsNil) 495 c.Assert(env.Name(), gc.Equals, "foo") 496 c.Assert(env.UUID() == s.State.EnvironUUID(), jc.IsFalse) 497 c.Assert(env.Owner(), gc.Equals, owner.UserTag()) 498 499 cfg, err := st.EnvironConfig() 500 c.Assert(err, jc.ErrorIsNil) 501 c.Assert(cfg.AllAttrs()["default-series"], gc.Equals, "precise") 502 }