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