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  }