github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/worker/apiaddressupdater/apiaddressupdater_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package apiaddressupdater_test
     5  
     6  import (
     7  	stdtesting "testing"
     8  	"time"
     9  
    10  	gc "launchpad.net/gocheck"
    11  
    12  	"github.com/juju/juju/instance"
    13  	jujutesting "github.com/juju/juju/juju/testing"
    14  	"github.com/juju/juju/state"
    15  	coretesting "github.com/juju/juju/testing"
    16  	"github.com/juju/juju/worker/apiaddressupdater"
    17  )
    18  
    19  func TestPackage(t *stdtesting.T) {
    20  	coretesting.MgoTestPackage(t)
    21  }
    22  
    23  type APIAddressUpdaterSuite struct {
    24  	jujutesting.JujuConnSuite
    25  }
    26  
    27  var _ = gc.Suite(&APIAddressUpdaterSuite{})
    28  
    29  type apiAddressSetter struct {
    30  	servers chan [][]instance.HostPort
    31  	err     error
    32  }
    33  
    34  func (s *apiAddressSetter) SetAPIHostPorts(servers [][]instance.HostPort) error {
    35  	s.servers <- servers
    36  	return s.err
    37  }
    38  
    39  func (s *APIAddressUpdaterSuite) TestStartStop(c *gc.C) {
    40  	st, _ := s.OpenAPIAsNewMachine(c, state.JobHostUnits)
    41  	worker := apiaddressupdater.NewAPIAddressUpdater(st.Machiner(), &apiAddressSetter{})
    42  	worker.Kill()
    43  	c.Assert(worker.Wait(), gc.IsNil)
    44  }
    45  
    46  func (s *APIAddressUpdaterSuite) TestAddressInitialUpdate(c *gc.C) {
    47  	updatedServers := [][]instance.HostPort{instance.AddressesWithPort(
    48  		instance.NewAddresses("localhost", "127.0.0.1"),
    49  		1234,
    50  	)}
    51  	err := s.State.SetAPIHostPorts(updatedServers)
    52  	c.Assert(err, gc.IsNil)
    53  
    54  	setter := &apiAddressSetter{servers: make(chan [][]instance.HostPort, 1)}
    55  	st, _ := s.OpenAPIAsNewMachine(c, state.JobHostUnits)
    56  	worker := apiaddressupdater.NewAPIAddressUpdater(st.Machiner(), setter)
    57  	defer func() { c.Assert(worker.Wait(), gc.IsNil) }()
    58  	defer worker.Kill()
    59  
    60  	// SetAPIHostPorts should be called with the initial value.
    61  	select {
    62  	case <-time.After(coretesting.LongWait):
    63  		c.Fatalf("timed out waiting for SetAPIHostPorts to be called")
    64  	case servers := <-setter.servers:
    65  		c.Assert(servers, gc.DeepEquals, updatedServers)
    66  	}
    67  }
    68  
    69  func (s *APIAddressUpdaterSuite) TestAddressChange(c *gc.C) {
    70  	setter := &apiAddressSetter{servers: make(chan [][]instance.HostPort, 1)}
    71  	st, _ := s.OpenAPIAsNewMachine(c, state.JobHostUnits)
    72  	worker := apiaddressupdater.NewAPIAddressUpdater(st.Machiner(), setter)
    73  	defer func() { c.Assert(worker.Wait(), gc.IsNil) }()
    74  	defer worker.Kill()
    75  	s.BackingState.StartSync()
    76  	updatedServers := [][]instance.HostPort{instance.AddressesWithPort(
    77  		instance.NewAddresses("localhost", "127.0.0.1"),
    78  		1234,
    79  	)}
    80  	// SetAPIHostPorts should be called with the initial value (empty),
    81  	// and then the updated value.
    82  	select {
    83  	case <-time.After(coretesting.LongWait):
    84  		c.Fatalf("timed out waiting for SetAPIHostPorts to be called first")
    85  	case servers := <-setter.servers:
    86  		c.Assert(servers, gc.HasLen, 0)
    87  	}
    88  	err := s.State.SetAPIHostPorts(updatedServers)
    89  	c.Assert(err, gc.IsNil)
    90  	s.BackingState.StartSync()
    91  	select {
    92  	case <-time.After(coretesting.LongWait):
    93  		c.Fatalf("timed out waiting for SetAPIHostPorts to be called second")
    94  	case servers := <-setter.servers:
    95  		c.Assert(servers, gc.DeepEquals, updatedServers)
    96  	}
    97  }