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