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