github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/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.v5" 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.State 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.JujuConnSuite.TearDownTest(c) 67 } 68 69 func (s *RevisionUpdateSuite) runUpdater(c *gc.C, updateInterval time.Duration) { 70 s.PatchValue(charmrevisionworker.Interval, updateInterval) 71 revisionUpdaterState := s.st.CharmRevisionUpdater() 72 c.Assert(revisionUpdaterState, gc.NotNil) 73 74 s.versionUpdater = charmrevisionworker.NewRevisionUpdateWorker(revisionUpdaterState) 75 s.AddCleanup(func(c *gc.C) { s.versionUpdater.Stop() }) 76 } 77 78 func (s *RevisionUpdateSuite) checkCharmRevision(c *gc.C, expectedRev int) bool { 79 checkRevision := func() bool { 80 curl := charm.MustParseURL("cs:quantal/mysql") 81 placeholder, err := s.State.LatestPlaceholderCharm(curl) 82 return err == nil && placeholder.String() == curl.WithRevision(expectedRev).String() 83 } 84 85 success := false 86 for attempt := coretesting.LongAttempt.Start(); attempt.Next(); { 87 if success = checkRevision(); success { 88 break 89 } 90 } 91 return success 92 } 93 94 func (s *RevisionUpdateSuite) TestVersionUpdateRunsInitially(c *gc.C) { 95 s.SetupScenario(c) 96 97 // Run the updater with a long update interval to ensure only the initial 98 // update on startup is run. 99 s.runUpdater(c, time.Hour) 100 c.Assert(s.checkCharmRevision(c, 23), jc.IsTrue) 101 } 102 103 func (s *RevisionUpdateSuite) TestVersionUpdateRunsPeriodically(c *gc.C) { 104 s.SetupScenario(c) 105 106 // Start the updater and check the initial status. 107 s.runUpdater(c, 5*time.Millisecond) 108 c.Assert(s.checkCharmRevision(c, 23), jc.IsTrue) 109 110 // Make some changes 111 id := charm.MustParseReference("~who/quantal/mysql-24") 112 ch := testcharms.Repo.CharmArchive(c.MkDir(), id.Name) 113 s.Server.UploadCharm(c, ch, id, true) 114 // Check the results of the latest changes. 115 c.Assert(s.checkCharmRevision(c, 24), jc.IsTrue) 116 } 117 118 func (s *RevisionUpdateSuite) TestDiesOnError(c *gc.C) { 119 mockUpdate := func(ruw *charmrevisionworker.RevisionUpdateWorker) error { 120 return errors.New("boo") 121 } 122 s.PatchValue(&charmrevisionworker.UpdateVersions, mockUpdate) 123 124 revisionUpdaterState := s.st.CharmRevisionUpdater() 125 c.Assert(revisionUpdaterState, gc.NotNil) 126 127 versionUpdater := charmrevisionworker.NewRevisionUpdateWorker(revisionUpdaterState) 128 err := versionUpdater.Stop() 129 c.Assert(errors.Cause(err), gc.ErrorMatches, "boo") 130 }