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  }