github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/worker/minunitsworker/minunitsworker_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package minunitsworker_test
     5  
     6  import (
     7  	stdtesting "testing"
     8  	"time"
     9  
    10  	"github.com/juju/loggo"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/juju/testing"
    15  	coretesting "github.com/juju/juju/testing"
    16  	"github.com/juju/juju/worker"
    17  	"github.com/juju/juju/worker/minunitsworker"
    18  )
    19  
    20  var logger = loggo.GetLogger("juju.worker.minunitsworker_test")
    21  
    22  func TestPackage(t *stdtesting.T) {
    23  	coretesting.MgoTestPackage(t)
    24  }
    25  
    26  type minUnitsWorkerSuite struct {
    27  	testing.JujuConnSuite
    28  }
    29  
    30  var _ = gc.Suite(&minUnitsWorkerSuite{})
    31  
    32  var _ worker.StringsWatchHandler = (*minunitsworker.MinUnitsWorker)(nil)
    33  
    34  func (s *minUnitsWorkerSuite) TestMinUnitsWorker(c *gc.C) {
    35  	mu := minunitsworker.NewMinUnitsWorker(s.State)
    36  	defer func() { c.Assert(worker.Stop(mu), gc.IsNil) }()
    37  
    38  	// Set up services and units for later use.
    39  	wordpress := s.AddTestingService(c, "wordpress", s.AddTestingCharm(c, "wordpress"))
    40  	mysql := s.AddTestingService(c, "mysql", s.AddTestingCharm(c, "mysql"))
    41  	unit, err := wordpress.AddUnit()
    42  	c.Assert(err, jc.ErrorIsNil)
    43  	_, err = wordpress.AddUnit()
    44  	c.Assert(err, jc.ErrorIsNil)
    45  
    46  	// Set up minimum units for services.
    47  	err = wordpress.SetMinUnits(3)
    48  	c.Assert(err, jc.ErrorIsNil)
    49  	err = mysql.SetMinUnits(2)
    50  	c.Assert(err, jc.ErrorIsNil)
    51  
    52  	// Remove a unit for a service.
    53  	err = unit.Destroy()
    54  	c.Assert(err, jc.ErrorIsNil)
    55  
    56  	timeout := time.After(coretesting.LongWait)
    57  	for {
    58  		s.State.StartSync()
    59  		select {
    60  		case <-time.After(coretesting.ShortWait):
    61  			wordpressUnits, err := wordpress.AllUnits()
    62  			c.Assert(err, jc.ErrorIsNil)
    63  			mysqlUnits, err := mysql.AllUnits()
    64  			c.Assert(err, jc.ErrorIsNil)
    65  			wordpressCount := len(wordpressUnits)
    66  			mysqlCount := len(mysqlUnits)
    67  			if wordpressCount == 3 && mysqlCount == 2 {
    68  				return
    69  			}
    70  			logger.Infof("wordpress units: %d; mysql units: %d", wordpressCount, mysqlCount)
    71  		case <-timeout:
    72  			c.Fatalf("timed out waiting for minunits events")
    73  		}
    74  	}
    75  }