github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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  	gc "launchpad.net/gocheck"
    12  
    13  	"github.com/juju/juju/juju/testing"
    14  	coretesting "github.com/juju/juju/testing"
    15  	"github.com/juju/juju/worker"
    16  	"github.com/juju/juju/worker/minunitsworker"
    17  )
    18  
    19  var logger = loggo.GetLogger("juju.worker.minunitsworker_test")
    20  
    21  func TestPackage(t *stdtesting.T) {
    22  	coretesting.MgoTestPackage(t)
    23  }
    24  
    25  type minUnitsWorkerSuite struct {
    26  	testing.JujuConnSuite
    27  }
    28  
    29  var _ = gc.Suite(&minUnitsWorkerSuite{})
    30  
    31  var _ worker.StringsWatchHandler = (*minunitsworker.MinUnitsWorker)(nil)
    32  
    33  func (s *minUnitsWorkerSuite) TestMinUnitsWorker(c *gc.C) {
    34  	mu := minunitsworker.NewMinUnitsWorker(s.State)
    35  	defer func() { c.Assert(worker.Stop(mu), gc.IsNil) }()
    36  
    37  	// Set up services and units for later use.
    38  	wordpress := s.AddTestingService(c, "wordpress", s.AddTestingCharm(c, "wordpress"))
    39  	mysql := s.AddTestingService(c, "mysql", s.AddTestingCharm(c, "mysql"))
    40  	unit, err := wordpress.AddUnit()
    41  	c.Assert(err, gc.IsNil)
    42  	_, err = wordpress.AddUnit()
    43  	c.Assert(err, gc.IsNil)
    44  
    45  	// Set up minimum units for services.
    46  	err = wordpress.SetMinUnits(3)
    47  	c.Assert(err, gc.IsNil)
    48  	err = mysql.SetMinUnits(2)
    49  	c.Assert(err, gc.IsNil)
    50  
    51  	// Remove a unit for a service.
    52  	err = unit.Destroy()
    53  	c.Assert(err, gc.IsNil)
    54  
    55  	timeout := time.After(coretesting.LongWait)
    56  	for {
    57  		s.State.StartSync()
    58  		select {
    59  		case <-time.After(coretesting.ShortWait):
    60  			wordpressUnits, err := wordpress.AllUnits()
    61  			c.Assert(err, gc.IsNil)
    62  			mysqlUnits, err := mysql.AllUnits()
    63  			c.Assert(err, gc.IsNil)
    64  			wordpressCount := len(wordpressUnits)
    65  			mysqlCount := len(mysqlUnits)
    66  			if wordpressCount == 3 && mysqlCount == 2 {
    67  				return
    68  			}
    69  			logger.Infof("wordpress units: %d; mysql units: %d", wordpressCount, mysqlCount)
    70  		case <-timeout:
    71  			c.Fatalf("timed out waiting for minunits events")
    72  		}
    73  	}
    74  }