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  }