launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/worker/charmrevisionworker/revisionupdater_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package charmrevisionworker_test 5 6 import ( 7 gc "launchpad.net/gocheck" 8 stdtesting "testing" 9 "time" 10 11 "launchpad.net/juju-core/charm" 12 "launchpad.net/juju-core/state" 13 "launchpad.net/juju-core/state/api" 14 "launchpad.net/juju-core/state/apiserver/charmrevisionupdater/testing" 15 coretesting "launchpad.net/juju-core/testing" 16 jc "launchpad.net/juju-core/testing/checkers" 17 "launchpad.net/juju-core/utils" 18 "launchpad.net/juju-core/worker/charmrevisionworker" 19 ) 20 21 func TestPackage(t *stdtesting.T) { 22 coretesting.MgoTestPackage(t) 23 } 24 25 type RevisionUpdateSuite struct { 26 testing.CharmSuite 27 28 st *api.State 29 versionUpdater *charmrevisionworker.RevisionUpdateWorker 30 } 31 32 var _ = gc.Suite(&RevisionUpdateSuite{}) 33 34 func (s *RevisionUpdateSuite) SetUpSuite(c *gc.C) { 35 c.Assert(*charmrevisionworker.Interval, gc.Equals, 24*time.Hour) 36 s.CharmSuite.SetUpSuite(c) 37 } 38 39 func (s *RevisionUpdateSuite) SetUpTest(c *gc.C) { 40 s.CharmSuite.SetUpTest(c) 41 42 machine, err := s.State.AddMachine("quantal", state.JobManageEnviron) 43 c.Assert(err, gc.IsNil) 44 password, err := utils.RandomPassword() 45 c.Assert(err, gc.IsNil) 46 err = machine.SetPassword(password) 47 c.Assert(err, gc.IsNil) 48 err = machine.SetProvisioned("i-manager", "fake_nonce", nil) 49 c.Assert(err, gc.IsNil) 50 s.st = s.OpenAPIAsMachine(c, machine.Tag(), password, "fake_nonce") 51 c.Assert(s.st, gc.NotNil) 52 } 53 54 func (s *RevisionUpdateSuite) runUpdater(c *gc.C, updateInterval time.Duration) { 55 s.PatchValue(charmrevisionworker.Interval, updateInterval) 56 revisionUpdaterState := s.st.CharmRevisionUpdater() 57 c.Assert(revisionUpdaterState, gc.NotNil) 58 59 s.versionUpdater = charmrevisionworker.NewRevisionUpdateWorker(revisionUpdaterState) 60 s.AddCleanup(func(c *gc.C) { s.versionUpdater.Stop() }) 61 } 62 63 func (s *RevisionUpdateSuite) checkCharmRevision(c *gc.C, expectedRev int) bool { 64 checkRevision := func() bool { 65 curl := charm.MustParseURL("cs:quantal/mysql") 66 placeholder, err := s.State.LatestPlaceholderCharm(curl) 67 return err == nil && placeholder.String() == curl.WithRevision(expectedRev).String() 68 } 69 70 success := false 71 for attempt := coretesting.LongAttempt.Start(); attempt.Next(); { 72 if success = checkRevision(); success { 73 break 74 } 75 } 76 return success 77 } 78 79 func (s *RevisionUpdateSuite) TestVersionUpdateRunsInitially(c *gc.C) { 80 s.SetupScenario(c) 81 82 // Run the updater with a long update interval to ensure only the initial 83 // update on startup is run. 84 s.runUpdater(c, time.Hour) 85 c.Assert(s.checkCharmRevision(c, 23), jc.IsTrue) 86 } 87 88 func (s *RevisionUpdateSuite) TestVersionUpdateRunsPeriodically(c *gc.C) { 89 s.SetupScenario(c) 90 91 // Start the updater and check the initial status. 92 s.runUpdater(c, 5*time.Millisecond) 93 c.Assert(s.checkCharmRevision(c, 23), jc.IsTrue) 94 95 // Make some changes 96 s.UpdateStoreRevision("cs:quantal/mysql", 24) 97 // Check the results of the latest changes. 98 c.Assert(s.checkCharmRevision(c, 24), jc.IsTrue) 99 }